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
Подробнее о дефекте можно почитать здесь.