FULL OUTER JOIN
Возвращает все строки из обеих таблиц. Где нет совпадения — NULL с соответствующей стороны.
SELECT ... FROM t1 FULL OUTER JOIN t2 ON t1.id = t2.t1_id;Объяснение
Пример
-- Найти несоответствия между двумя источниками данных
SELECT a.id AS id_a, b.id AS id_b
FROM source_a a
FULL OUTER JOIN source_b b ON a.id = b.id
WHERE a.id IS NULL OR b.id IS NULL;Связанные термины
Анекдоты по теме
— Какая разница между INNER JOIN и дружбой? — INNER JOIN рвётся, если нет совпадений. А дружба — LEFT JOIN. Даже когда вы не совпадаете, ты всё равно остаёшься в таблице.
Рекурсивный CTE для иерархии: WITH RECURSIVE tree AS ( SELECT id, name, parent_id, 0 AS depth FROM categories WHERE parent_id IS NULL UNION ALL SELECT c.id, c.name, c.parent_id, t.depth + 1 FROM categories c JOIN tree t ON c.parent_id = t.id ) SELECT * FROM tree ORDER BY depth, name; Программист: это чище чем 10 JOIN!
Что общего между FULL OUTER JOIN и семейной встречей? Приходят все. И те, кого ждали, и те, кого нет. А если с одной стороны никого — всё равно место за столом будет.