PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Perché PostgreSQL non può fare questo semplice FULL JOIN?

PostgreSQL implementa FULL OUTER JOIN con un hash o un merge join.

Per essere idoneo a tale adesione, la condizione di adesione deve avere il modulo

<expression using only left table> <operator> <expression using only right table>

Ora la tua condizione di adesione fa assomiglia a questo, ma PostgreSQL non ha uno speciale IS NOT DISTINCT FROM operatore, quindi analizza la tua condizione in:

(NOT ($1 IS DISTINCT FROM $2))

E una tale espressione non può essere utilizzata per hash o merge join, da qui il messaggio di errore.

Posso pensare a un modo per aggirarlo:

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;

Funziona se <null> non appare da nessuna parte nel value colonne.