首页 >数据库 >mysql教程 >如何在 SQL 中高效连接一对多关系的数据?

如何在 SQL 中高效连接一对多关系的数据?

Susan Sarandon
Susan Sarandon原创
2024-12-29 12:02:12176浏览

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;

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn