Sql 使一对多关系看起来像一对一
我用的是postgres 9.3.5 鉴于以下数据:Sql 使一对多关系看起来像一对一,sql,postgresql,Sql,Postgresql,我用的是postgres 9.3.5 鉴于以下数据: select * from department; id | name ----+----------- 1 | sales 2 | marketing 3 | HR 及 我想返回如下结果集: id | name | first_name-1 | last_name-1 | first_name-2 | last_name-2 | first_name-3 | last_name-3 ----+----
select * from department;
id | name
----+-----------
1 | sales
2 | marketing
3 | HR
及
我想返回如下结果集:
id | name | first_name-1 | last_name-1 | first_name-2 | last_name-2 | first_name-3 | last_name-3
----+-----------+--------------+-------------+--------------+-------------+--------------+------------
1 | sales | Tom | Jones | Bill | Cosby | Rachel | Hunter
2 | marketing | Jessica | Biel | John | Barnes
3 | HR |
这可能吗
Max Shawabkeh使用GROUP_CONCAT提供的答案很接近-但它不会作为数据集中的额外字段返回,而是将它们连接到单个字段中。您需要交叉制表(有时称为pivot)
在您的案例中可能是这样的:
SELECT * FROM crosstab(
$$SELECT d.id, d.name,'p' AS dummy_cat
,concat_ws(' ', p.first_name, p.last_name) AS person
FROM department d
LEFT JOIN people p ON p.department_id = d.id
ORDER BY d.department_id, p.id$$
)
AS ct (id int, department text, person_1 text, person_2 text, person_3 text);
返回:
id department person_1 person_2 person_3
--------------------------------------------------------
1 sales Tom Jones Bill Cosby Rachel Hunter
2 marketing Jessica Biel John Barnes <NULL>
3 HR <NULL> <NULL> <NULL>
id部门人员\u 1人员\u 2人员\u 3
--------------------------------------------------------
1销售汤姆·琼斯·比尔·科斯比·瑞秋·亨特
2营销杰西卡·贝尔·约翰·巴恩斯
3小时
与此相关案例非常相似(特殊困难的解释):
crosstab()
此外,根据您的评论,您需要所有部门,即使没有分配人员。相应地调整了左连接
此相关答案中的基本细节:
左连接以包含空部门并简化了查询。单独的名称也可以解决。在外部查询中分解。再次感谢,但新查询为我返回了一个错误:错误:d列。部门id不存在exist@CodeBuddy:显然,这是d.id
(在我自己的设计中,我从不使用像“id”或“name”这样的非描述性词语作为标识符。)
id department person_1 person_2 person_3
--------------------------------------------------------
1 sales Tom Jones Bill Cosby Rachel Hunter
2 marketing Jessica Biel John Barnes <NULL>
3 HR <NULL> <NULL> <NULL>