Соединение влево, если значение равно NULL, в противном случае внутреннее соединение - PullRequest
0 голосов
/ 16 января 2019

Я хочу объединить две таблицы, которые копируют поведение левого соединения, если значение равно NULL, и поведение внутреннего соединения, если значение NOT NULL. Например, для таблиц:

t1(val) AS (VALUES (NULL)),
t2(val) AS (VALUES ('a'), ('b'))

Объединение вернет одну строку со значениями (NULL,NULL) (согласно левому соединению). Для столов:

t1(val) AS (VALUES ('c')),
t2(val) AS (VALUES ('a'), ('b'))

Никакие строки не будут возвращены (согласно внутреннему соединению). Для столов:

t1(val) AS (VALUES ('a')),
t2(val) AS (VALUES ('a'), ('b'))

Будет возвращена одна строка со значениями ('a','a') (для каждого типа объединения).

Какой самый эффективный способ сделать это?

РЕДАКТИРОВАТЬ: Как часть максимальной эффективности, я ищу запрос, который не постфильтровать (то есть использовать предложение WHERE).

1 Ответ

0 голосов
/ 16 января 2019

Вы можете использовать это:

SELECT t1.val, t2.val
FROM t1
LEFT JOIN t2
ON t1.val = t2.val 
WHERE t1.val IS NULL OR t1.val = t2.val;

Или:

SELECT NULL AS val1, NULL AS val2
FROM t1 
WHERE val IS NULL 
UNION ALL 
SELECT t2.val, t2.val 
FROM t2
INNER JOIN t1 ON t1.val = t2.val;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...