39. Эквивалент 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
);