PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Por que o PostgreSQL não pode fazer este simples FULL JOIN?


PostgreSQL implementa FULL OUTER JOIN com um hash ou uma junção de mesclagem.

Para ser elegível para tal associação, a condição de associação deve ter o formulário
<expression using only left table> <operator> <expression using only right table>

Agora sua condição de associação não se parece com isso, mas o PostgreSQL não tem um IS NOT DISTINCT FROM especial operador, então ele analisa sua condição em:
(NOT ($1 IS DISTINCT FROM $2))

E essa expressão não pode ser usada para junções de hash ou mesclagem, daí a mensagem de erro.

Eu posso pensar em uma maneira de contornar isso:
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;

Isso funciona se <null> não aparece em nenhum lugar no value colunas.