Postgres将两个具有多个发现的表连接在一起

时间:2018-10-22 09:44:17

标签: postgresql

一个玩家可以拥有1或2个团队。我想同时加入这两个表,每个球员只有一行或一两支队伍

给定表:

### Player ###
 id PK
 name 
 team_id

### Team ###
 id PK
 name

表中的值:

SELECT * FROM player;

id | name        | team_id
---+-------------+-------------
1  | John Adams  | 1
2  | John Adams  | 2
3  | Max Roberts | 3


SELECT * FROM team;

id | name
---+------------------
1  | Red Stars
2  | Blue Birds
3  | Grey Tigers

我想加入两个表,以获取每个玩家的以下输出:

player_name  | team_1      | team_2
-------------+-------------+------------------
John Adams   | Red Stars   | Blue Birds
Max Roberts  | Grey Tigers | NULL

到目前为止,我唯一可以存档的是以下内容。但是我不希望约翰·亚当斯有两排。

SELECT player.name as player_name, team.name as team 
FROM player JOIN team ON player.team_id = team.id;

player_name      | team
-----------------+--------------------
John Adams       | Red Stars
John Adams       | Blue Birds
Max Roberts      | Grey Tigers

是的,我知道这不是特定情况下的良好数据库布局,但是我无法更改给定的数据库布局。

1 个答案:

答案 0 :(得分:0)

要使用当前结构获得预期的输出,可以将array_agg与join和group by一起使用

select p.name, (array_agg(t.name))[1] team1, (array_agg(t.name))[2] team2
from player p
left join team t on t.id = p.team_id
group by p.name

Demo