Соединить одну таблицу с двумя другими по идентификатору - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь объединить одну таблицу с двумя другими, которые не связаны друг с другом, но связаны с первой идентификатором

У меня есть следующие таблицы

create table groups(
 id int,
 name text
);

create table members(
 id int,
 groupid int,
 name text
);

create table invites(
 id int,
 groupid int,
 status int    \\ 2 for accepted, 1 if it's pending
);

Затем Я вставил следующие данные

insert into groups (id, name) values(1,'group');
insert into members(id, groupid, name) values(1,1,'admin'),(1,1,'other');
insert into invites(id, groupid, status) values(1,1,2),(2,1,1),(3,1,1);

Obs:

  • У администратора нет приглашения
  • У группы есть утвержденное приглашение со статусом 2 (поскольку участник «прочее» присоединился)
  • Группа имеет два ожидающих приглашения со статусом 1

Я пытаюсь сделать запрос, который получит следующий результат

groupid | name  | inviteId
1       | admin | null
1       | other | null
1       | null  | 2
1       | null  | 3        

Я попробовал следующие запросы без удачи

select g.id, m.name, i.id from groups g
left join members m ON m.groupid = g.id
left join invites i ON i.groupid = g.id and i.status = 1;
select g.id, m.name, i.id from groups g
join (select groupid, name from members) m ON m.groupid = g.id
join (select groupid, id from invites where status = 1) i ON i.groupid = g.id;

Есть идеи, что я делаю неправильно?

1 Ответ

1 голос
/ 03 марта 2020

Поскольку members и invites не связаны, вам нужно использовать два отдельных запроса и использовать UNION (автоматически удаляет дубликаты) или UNION ALL (сохраняет дубликаты), чтобы получить желаемый результат:

select g.id as groupid, m.name, null as inviteid from groups g
  join members m ON m.groupid = g.id
union all 
select g.id, null, i.id from groups g
  join invites i ON (i.groupid = g.id and i.status = 1);

Вывод:

 groupid | name  | inviteid 
---------+-------+----------
       1 | admin |         
       1 | other |         
       1 |       |        3
       1 |       |        2
(4 rows)

Без UNION ваш запрос подразумевает, что таблицы имеют какую-то связь, поэтому столбцы соединяются бок о бок. Поскольку вы хотите сохранить значения null, подразумевая, что таблицы не связаны, вам необходимо объединить / соединить их вертикально с UNION

Раскрытие информации: я работаю для EnterpriseDB (EDB)

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