Как сделать внешнее соединение с полным результатом между двумя таблицами - PullRequest
0 голосов
/ 15 мая 2019

У меня есть две таблицы:

TABLE1

id_attr
-------
1
2
3

TABLE2

id  |  id_attr  | val
----------------------
10  |  1        | A
10  |  2        | B

В результате яхочу таблицу, которая показывает:

РЕЗУЛЬТАТ

id  |  id_attr  | val
----------------------
10  |  1        | A
10  |  2        | B
10  |  3        | NULL

Итак, я хочу строку с id = 10 и id_attr = 3 также, когда id_Attr = 3 отсутствует в TABLE2(и я знаю это, потому что у меня есть NULL-значение (или что-то еще) в столбце val RESULT.

NB: у меня могут быть другие идентификаторы в таблице 2. Например, после вставки этой строки в таблицу 2: {11,1, A}, в качестве РЕЗУЛЬТАТА я хочу:

id  |  id_attr  | val
----------------------
10  |  1        | A
10  |  2        | B
10  |  3        | NULL
11  |  1        | A
11  |  2        | NULL
11  |  3        | NULL

Итак, для каждого идентификатора я хочу всегда совпадать со всеми id_attr.

Ответы [ 3 ]

1 голос
/ 15 мая 2019

В вашем конкретном примере есть только один id, поэтому вы можете использовать следующее:

select t2.id, t2.id_attr, t2.val
from table2 t2
union all
select 10, t1.id_attr, NULL
from table1 t1
where not exists (select 1 from table2 t2 where t2.id_attr = t1.id_attr);

EDIT:

Вы можете получить все комбинации атрибутов и идентификаторов следующим образом. Используйте cross join, чтобы создать все нужные вам строки, а затем left join, чтобы ввести нужные данные:

select i.id, t1.id_attr, t2.val
from (select distinct id from table2) i cross join
     table1 t1 left join
     table2 t2
     on t2.id = i.id and t2.id_attr = t1.id_attr;
0 голосов
/ 15 мая 2019

Это самое близкое значение, которое вы можете получить:

SELECT id, Table1.id_attr, val из Table1

ВЛЕВО НАРУЖНОЕ ОБЪЕДИНЕНИЕ Table2 ON Table1.id_attr = Table2.id_attr

Я не думаю, что вы могли бы иметь

id = 10 и id_attr = 3, когда вы присоединяетесь к таблицам, основываясь на информации, которую вы предоставили, не имеет никакого отношения.

Если нет другого соединениямы не знаем о

0 голосов
/ 15 мая 2019

Звучит так, как будто вы хотите сделать внешнее соединение для id_attr вместо id.

select * from table2 t2
    left outer join table1 t1 on t2.id_attr = t1.id_attr;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...