掌握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
PostSQLSELECT 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 使用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中文網其他相關文章!