sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Por qué PostgreSQL no puede hacer esta simple UNIÓN COMPLETA?

PostgreSQL implementa FULL OUTER JOIN ya sea con un hash o una combinación de combinación.

Para ser elegible para dicha unión, la condición de unión debe tener la forma

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

Ahora su condición de unión se ve así, pero PostgreSQL no tiene un IS NOT DISTINCT FROM especial operador, por lo que analiza su condición en:

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

Y dicha expresión no se puede usar para combinaciones hash o merge, de ahí el mensaje de error.

Se me ocurre una forma de evitarlo:

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;

Eso funciona si <null> no aparece en ninguna parte del value columnas.