首页 > 数据库 > 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;
登录后复制

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板