Можно ли написать SQL для всех совпадений в тройном соединении без объединения? - PullRequest
0 голосов
/ 29 апреля 2020

Я бы хотел выполнить объединение SQL для серой области на следующей диаграмме Венна, но без использования UNION:

Venn diagram triple join

Пожалуйста, возможно ли это?

Ради простоты представьте, что все таблицы имеют только два столбца: id и value , id одинаков для всех них.

Вот пример данных:

Set A
| id | value   |
----------------
| 1  | red     |
| 2  | magenta |
| 3  | white   |
| 4  | yellow  |

Set B
| id | value   |
----------------
| 2  | magenta |
| 3  | white   |
| 5  | blue    |
| 6  | cyan    |

Set C
| id | value   |
----------------
| 7  | green   |
| 3  | white   |
| 4  | yellow  |
| 6  | cyan    |

Resulting set
| id | value   |
----------------
| 2  | magenta |
| 3  | white   |
| 4  | yellow  |
| 6  | cyan    |

1 Ответ

1 голос
/ 29 апреля 2020

Вы можете full join дважды и добавить условные логи c в предложении where:

select id
from a
full join b using(id)
full join c using(id)
where 
    case when a.id is not null then 1 else 0 end
        + case when b.id is not null then 1 else 0 end
        + case when c.id is not null then 1 else 0 end
    > 1 

Не все базы данных поддерживают этот синтаксис. Более широко поддерживаемый подход действительно использует union all и агрегирование:

select id
from (
    select id from a
    union all select id from b
    union all select id from c
) t
group by id
having count(*) > 1
...