Postgres Соединить две таблицы с несколькими выводами в одной строке - PullRequest
0 голосов
/ 22 октября 2018

Игрок может иметь 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 голосов
/ 22 октября 2018

Чтобы получить ожидаемый результат с использованием имеющейся у вас структуры, вы можете использовать array_agg с объединением и группировкой, например

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

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...