FULL JOIN
- полное внешнее соединение. Если для какой-либо из таблиц не нашлось строки в другой таблице, то строка все равно попадает в результат, а значения столбцов другой таблицы равны null
.
Рассмотрим как работает FULL JOIN
на примере. Пусть у нас есть две таблицы:
SELECT *
FROM table1
id | value |
---|---|
1 | One |
2 | Two |
3 | Three |
и
SELECT *
FROM table2
id | value |
---|---|
2 | Two |
3 | Three |
4 | Four |
5 | Five |
На этих данных выполним запрос
SELECT t1.id as id_1,
t1.value as value_1,
t2.id as id_2,
t2.value as value_2
FROM table1 t1
FULL JOIN
table2 t2
ON t1.id = t2.id
ORDER BY t1.id, t2.id
id_1 | value_1 | id_2 | value_2 |
---|---|---|---|
1 | One | ||
2 | Two | 2 | Two |
3 | Three | 3 | Three |
4 | Four | ||
5 | Five |
Однако, в реализации FULL JOIN
в PostgreSQL есть дефект. Например, если в условии соединения не будет условий на равенство столбцов таблиц (=
), или встретится OR
, то во время выполнения запроса возникнет ошибка:
FULL JOIN is only supported with merge-joinable or hash-joinable join conditions
Попробуй выполнить следующий запрос:
SELECT *
FROM product_price pp
FULL JOIN
product_price ppl
ON ppl.price < pp.price
Подробнее о дефекте можно почитать здесь.