在单个查询中检索相关记录
在关系数据库领域,经常需要从共享的不同表中查询多条记录一种关系。常见的场景是检索有关特定组织的所有信息及其所有员工的名字。
为了实现此目的,我们可以利用各种特定于数据库的技术,如下所述:
MySQL 和 PostgreSQL:
利用 MySQL 中内置的 GROUP_CONCAT 函数或 string_agg() PostgreSQL,我们可以聚合与给定组织相关的所有员工的名字,并将它们组合成一个字符串:
SELECT o.ID, o.Address, o.OtherDetails, GROUP_CONCAT(e.firstname) AS Employees FROM organization AS o JOIN employee AS e ON o.org_id = e.org_id GROUP BY o.org_id;
PostgreSQL 9.0 及更高版本:
PostgreSQL 9.0 及更高版本引入了 STRING_AGG 函数,该函数允许更灵活地连接:
SELECT o.ID, o.Address, o.OtherDetails, STRING_AGG(e.firstname || ' ' || e.lastname, ', ') AS Employees FROM organization AS o JOIN employee AS e 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, ', ') AS Employees FROM organization AS o JOIN employee AS e ON o.org_id = e.org_id GROUP BY o.org_id;
MS SQL Server:
MS SQL Server 提供 STRING_AGG function:
SELECT o.ID, o.Address, o.OtherDetails, STRING_AGG(e.firstname, ', ') AS Employees FROM organization AS o JOIN employee AS e ON o.org_id = e.org_id GROUP BY o.org_id;
其他数据库的后备解决方案:
如果您的数据库不支持任何这些内置函数,您可以选择后备解决方案通过创建一个存储过程,将组织 ID 作为输入并相应地连接员工姓名:
SELECT o.ID, o.Address, o.OtherDetails, MY_CUSTOM_GROUP_CONCAT_PROCEDURE(o.ID) AS Employees FROM organization AS o;
By利用这些技术,您可以高效地从相关表中检索多条记录并将它们以合并的形式呈现,从而消除了多次查询或逐行数据组装的需要。
以上是如何在单个查询中从不同数据库表中检索相关记录?的详细内容。更多信息请关注PHP中文网其他相关文章!