42. Эквивалент LEFT OUTER JOIN без использования OUTER JOIN #
Условие задачи:
📌 Есть две таблицы t1(A)
и t2(B)
.
Исходный запрос:
SELECT *
FROM t1
LEFT OUTER JOIN t2
ON t1.A = t2.B;
Необходимо переписать его эквивалентно без использования LEFT OUTER JOIN
.
Спойлеры к решению
Подсказки
💡 Разбейте на два подзапроса:
INNER JOIN для совпадающих строк.
Строки из
t1
, для которых нет совпадений вt2
.
💡 Объедините их с помощьюUNION ALL
.
💡 Для второго подзапроса используйтеNOT EXISTS
илиNOT IN
.
Решение
-- Вариант 1: INNER JOIN + UNION ALL + NOT EXISTS
SELECT t1.A, t2.B
FROM t1
JOIN t2
ON t1.A = t2.B
UNION ALL
SELECT t1.A, NULL AS B
FROM t1
WHERE NOT EXISTS (
SELECT 1
FROM t2
WHERE t2.B = t1.A
);
-- Вариант 2: INNER JOIN + UNION ALL + NOT IN
SELECT t1.A, t2.B
FROM t1
JOIN t2
ON t1.A = t2.B
UNION ALL
SELECT t1.A, NULL AS B
FROM t1
WHERE t1.A NOT IN (
SELECT t2.B
FROM t2
);