我有两个表组织和员工有一对多的关系,即一个组织可以有多个员工.现在,我想选择特定组织的所有信息以及该组织的所有员工的名字.最好的方法是什么?我可以在单个记录集中获得所有这些,或者我必须基于否获得多行.员工?这是我想要的一点图形演示:
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中没有标准解决方案.因此,您需要特定于供应商的解决方案.
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
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及更高版本也有此选项.)
select o.ID, o.Address, o.OtherDetails, MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) as Employees from organization o
如果您使用 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)