PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Warum kann PostgreSQL diesen einfachen FULL JOIN nicht ausführen?

PostgreSQL implementiert FULL OUTER JOIN entweder mit einem Hash oder einem Merge-Join.

Um für einen solchen Join in Frage zu kommen, muss die Join-Bedingung die Form

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

Jetzt erfüllt Ihre Join-Bedingung so aussehen, aber PostgreSQL hat keinen speziellen IS NOT DISTINCT FROM Operator, also zerlegt er Ihre Bedingung in:

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

Und ein solcher Ausdruck kann nicht für Hash- oder Merge-Joins verwendet werden, daher die Fehlermeldung.

Ich kann mir einen Weg vorstellen, das zu umgehen:

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;

Das funktioniert, wenn <null> erscheint nirgendwo im value Spalten.