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

Junção interna e junção externa; a ordem das tabelas é importante?


Acredito que você pode pensar nisso como um problema de precedência de operador.

Quando você escreve isso:
FROM groups grp,
     insrel archiverel  
LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber   
LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber   

Eu acho que é interpretado pelo analisador assim:
FROM groups grp,
(
  (
     insrel archiverel  
     LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber   
  )
LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber
)

Se sim, então na junção mais interna "grp" é desvinculado.

Quando você inverte as linhas com "grupos" e "insrel", a junção mais interna se aplica a "grupos" e "propriedade", então funciona.

Provavelmente isso também funcionaria:
    FROM groups grp
         JOIN insrel archiverel  ON archiverel.dnumber = grp.number
    LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber   
    LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber 
WHERE archiverel.snumber = 11128188