首頁 > 資料庫 > mysql教程 > 如何在 SQL 中高效連接一對多關係的資料?

如何在 SQL 中高效連接一對多關係的資料?

Susan Sarandon
發布: 2024-12-29 12:02:12
原創
155 人瀏覽過

How to Efficiently Concatenate Data from One-to-Many Relationships in SQL?

掌握SQL 中一對多關係的群組串聯

在關聯式資料庫中,通常需要從下列表格中擷取資訊:具有一對多關係。常見的場景是收集有關父記錄和關聯子記錄的資料。

考慮組織表和員工表的範例,其中每個組織可以有多個員工。為了檢索有關特定組織的所有資訊及其所有員工的名字,我們探索了不同的方法。

標準 SQL 技術

不幸的是,標準 SQL- 92 和 SQL-99 不包含用於群組串聯的內建函數。需要特定於供應商的解決方案。

MySQL

MySQL 提供GROUP_CONCAT 函數:

SELECT
  o.ID,
  o.Address,
  o.OtherDetails,
  GROUP_CONCAT(CONCAT(e.FirstName, ' ', e.LastName)) AS Employees
FROM
  Employees e
INNER JOIN
  Organization o
ON
  o.Org_ID = e.Org_ID
GROUP BY
  o.Org_ID;
登入後複製

PostSQL

PostSQL
SELECT
  o.ID,
  o.Address,
  o.OtherDetails,
  STRING_AGG((e.FirstName || ' ' || e.LastName), ', ') AS Employees
FROM
  Employees e
INNER JOIN
  Organization o
ON
  o.Org_ID = e.Org_ID
GROUP BY
  o.Org_ID;
登入後複製

PostSQL

SELECT
  o.ID,
  o.Address,
  o.OtherDetails,
  LISTAGG(e.FirstName || ' ' || e.LastName, ', ') WITHIN GROUP (ORDER BY e.FirstName) AS Employees
FROM
  Employees e
INNER JOIN
  Organization o
ON
  o.Org_ID = e.Org_ID
GROUP BY
  o.Org_ID;
登入後複製
Oracle

Oracle 使用LISTAGG 函數:

如果供應商特定的功能不可用,可以建立預存程序來執行

預存程序範例(通用)
CREATE PROCEDURE MY_CUSTOM_GROUP_CONCAT_PROCEDURE
(
  @Org_ID INT
)
AS
BEGIN
  DECLARE @Employees NVARCHAR(MAX) = '';
  SELECT @Employees = @Employees + FirstName + ' ' + LastName + ', '
  FROM Employees
  WHERE Org_ID = @Org_ID;
  
  SELECT @Employees = LEFT(@Employees, LEN(@Employees) - 2);
  RETURN @Employees;
END
GO;
登入後複製

用法
SELECT
  o.ID,
  o.Address,
  o.OtherDetails,
  MY_CUSTOM_GROUP_CONCAT_PROCEDURE(o.ID) AS Employees
FROM
  Organization o;
登入後複製

透過利用這些技術,開發人員可以有效地檢索與一條記錄關聯的多記錄信息,以一對多的方式提供數據的整體視圖關係。

以上是如何在 SQL 中高效連接一對多關係的資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板