Найти разницу между тремя таблицами - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь найти разницу между тремя таблицами, a, b и c. Я хотел бы объединить все три, показывая нули, где в каждой таблице нет записей.

В каждой таблице есть два столбца, к которым я хотел бы присоединиться, скажем, имя и фамилия.

Пока что это то, чем я занимаюсь.

Select * from a 
FULL OUTER JOIN b on 
  a.firstName = b.firstName AND a.lastname = b.lastname 
FULL OUTER JOIN c on 
  (c.firstName = a.firstName and c.lastName = a.LastNAME) OR 
  (c.firstName = b.firstName AND c.lastname = b.LastName)

Я не уверен, что логика в моих выводах верна. Есть ли лучший способ сделать это? В английском языке первое объединение объединяет A и B, включая записи в каждой таблице, которых нет в другой таблице. Второе соединение соединяет A + B с C, соединяя C с A или B, если оно совпадает.

1 Ответ

1 голос
/ 15 октября 2019

Возможно, вы захотите:

select firstname, lastname, sum(in_a), sum(in_b), sum(in_c)
from ((select firstname, lastname, 1 as in_a, 0 as in_b, 0 as in_c
       from a
      ) union all
      (select firstname, lastname, 0 as in_a, 1 as in_b, 0 as in_c
       from b
      ) union all
      (select firstname, lastname, 0 as in_a, 0 as in_b, 1 as in_c
       from c
      )
     ) abc
group by firstname, lastname;

Каждая пара должна firstname / lastname содержать информацию о том, сколько раз пара находится в каждой таблице.

Я предпочитаю union all / group by подходит для этого над left join по нескольким причинам:

  1. Без предложения using предложение on становится немного сложным, когда вы добавляете больше таблиц.
  2. Минимальное использование coalesce().
  3. Лучше обрабатывает дубликаты в пределах каждой таблицы.
  4. Обрабатывает NULL значений для ключей.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...