Вернуть все комбинации, включая нули - PullRequest
0 голосов
/ 23 апреля 2020

Я думаю, этот вопрос очень близок к тому, что мне нужно, но я не смог его снять, чтобы получить необходимые мне данные.

У меня есть 4 набора данных:

TableA    TableB    TableC   TableD
1         10        20       34
2         15        21
3         16
          17

Я хочу иметь возможность получить каждую комбинацию, включая пустые строки, поэтому мой результат будет выглядеть так:

TableA_id  TableB_id  TableC_id  TableD_id
1          NULL       NULL       NULL
1          10         NULL       NULL
1          10         20         NULL
1          10         20         34
1          10         21         NULL
1          10         20         34
1          15         NULL       NULL
1          15         20         NULL
1          15         20         34
1          15         21         NULL
1          15         21         34
... but then to also include ...
NULL       10         NULL       NULL
NULL       10         20         NULL
NULL       10         20         34   
NULL       10         21         NULL
NULL       10         21         34   
...
NULL       NULL       NULL       34

Использование приведенного ниже CROSS JOIN даст мне все полные комбинации, но чтобы получить частичные значения, единственное решение, которое я вижу, это UNION отдельные запросы, каждый из которых возвращает мне все строки с одинарным / двойным / тройным значением.

SELECT TableA.id AS TableA_id, TableB.id AS TableB_id, TableC.id AS TableC_id, TableD.id AS TableD_id
FROM TableA CROSS JOIN
    TableB CROSS JOIN
    TableC CROSS JOIN
    TableD

1 Ответ

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

Используйте UNION ALL для добавления строки со значением NULL в каждую таблицу, а затем CROSS JOIN для всех запросов:

select *
from (select id as id_a from tablea union all select null) a 
cross join (select id as id_b from tableb union all select null) b 
cross join (select id as id_c from tablec union all select null) c
cross join (select id as id_d from tabled union all select null) d
where coalesce(a.id_a, b.id_b, c.id_c, d.id_d) is not null

См. Демонстрационную версию .

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