掌握 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;
PostgreSQL
PostgreSQL 9.0 及更高版本提供了 STRING_AGG函数:
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;
Oracle
Oracle 使用 LISTAGG 函数:
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;
后备解决方案
如果供应商特定的功能不可用,可以创建存储过程来执行
存储过程示例(通用)
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中文网其他相关文章!