Sql 使一对多关系看起来像一对一

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 ----+----

我用的是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
----+-----------+--------------+-------------+--------------+-------------+--------------+------------ 
  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()

此外,根据您的评论,您需要所有部门,即使没有分配人员。相应地调整了左连接

此相关答案中的基本细节:


谢谢Erwin,非常接近我要查找的输出-缺少HR的空行以及名字和姓氏的单独列。@CodeBuddy:我反转了
左连接以包含空部门并简化了查询。单独的名称也可以解决。在外部查询中分解。再次感谢,但新查询为我返回了一个错误:错误: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>