如何基于关系获得针对一条记录的多条记录?

9 mysql sql database

我有两个表组织和员工有一对多的关系,即一个组织可以有多个员工.现在,我想选择特定组织的所有信息以及该组织的所有员工的名字.最好的方法是什么?我可以在单个记录集中获得所有这些,或者我必须基于否获得多行.员工?这是我想要的一点图形演示:

Org_ID      Org_Address    Org_OtherDetails    Employess

1           132A B Road    List of details     Emp1, Emp2, Emp3.....
Run Code Online (Sandbox Code Playgroud)

mda*_*man 19

最初的问题是数据库特定的,但也许这是一个包含更通用的答案的好地方.这是一个常见的问题.您描述的概念通常称为"组级联".SQL-92或SQL-99中没有标准解决方案.因此,您需要特定于供应商的解决方案.

  • 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

9.0之前的PostgreSQL允许您使用CREATE AGGREGATE定义自己的聚合函数.比MySQL更多的工作,但更灵活.有关详细信息,请参阅此其他帖子.(当然PostgreSQL 9.0及更高版本也有此选项.)

  • Oracle&MS SQL Server - 创建一个存储过程,该过程将org_id作为其输入并输出连接的员工姓名.然后在查询中使用此存储过程.这里的一些其他响应包括有关如何编写这些存储过程的一些细节.
select 
  o.ID, o.Address, o.OtherDetails,
  MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) as Employees
from 
  organization o
  • 其他DBMS技术 - 存储过程路由最有可能.也许其他人可以通过更多技术特定答案更新此答案.


Mik*_*ter 0

如果您使用 Oracle,您可以创建一个可在查询中使用的 PL/SQL 函数,该函数接受 Organization_id 作为输入,并以字符串形式返回属于该组织的所有员工的名字。例如:-

select
   o.org_id,
   o.org_address,
   o.org_otherdetails,
   org_employees( o.org_id ) as org_employees
from
   organization o
Run Code Online (Sandbox Code Playgroud)