PostgreSQL implementuje FULL OUTER JOIN
z haszem lub połączeniem scalającym.
Aby kwalifikować się do takiego przyłączenia, warunek przyłączenia musi mieć formę
<expression using only left table> <operator> <expression using only right table>
Teraz warunek dołączenia tak wygląda tak, ale PostgreSQL nie ma specjalnego IS NOT DISTINCT FROM
operatora, więc analizuje twój warunek na:
(NOT ($1 IS DISTINCT FROM $2))
A takie wyrażenie nie może być użyte do złączeń mieszających lub scalających, stąd komunikat o błędzie.
Potrafię wymyślić sposób na obejście tego:
SELECT a_id, NULLIF(a_value, '<null>'),
b_id, NULLIF(b_value, '<null>')
FROM (SELECT id AS a_id,
COALESCE(value, '<null>') AS a_value
FROM a
) x
FULL JOIN
(SELECT id AS b_id,
COALESCE(value, '<null>') AS b_value
FROM b
) y
ON x.a_value = y.b_value;
To działa, jeśli <null>
nie pojawia się nigdzie w value
kolumny.