Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Não entendi as junções?


Você está certo na descrição do nº 1... o problema com sua consulta está na etapa nº 2.

Quando você faz uma left join do reino para (família e espécie), você está solicitando todos os reinos, mesmo que não haja correspondência (família e espécie) ... no entanto, isso não retornará nenhuma combinação (família e espécie) que não tenha um reino correspondente.

Uma consulta mais próxima seria:
select *
    from reino r
         full join (
             familia f             
             right join especie e
                 on f.fnombre = e.efamilia
                 and f.freino = e.ereino
         ) on r.rnombre = f.freino 
           and r.rnombre = e.ereino;

Observe que a left join foi substituído por uma full join ...

no entanto, isso retorna apenas famílias associadas a uma espécie... não retorna nenhuma família associada a reinos, mas não a espécies.

Depois de reler sua pergunta, isso é realmente o que você queria ...

EDIT:Pensando melhor, você pode reescrever sua consulta assim:
select *
from 
    especie e
    left join familia f 
        on f.fnombre = e.efamilia
        and f.freino = e.ereino
    full join reino r
        on r.rnombre = f.freino 
        and r.rnombre = e.ereino;

Eu acho que isso seria preferível, porque você elimina o RIGHT JOIN , que geralmente são desaprovados por serem de estilo ruim... e os parênteses, que podem ser complicados para as pessoas analisarem corretamente para determinar qual será o resultado.