sql >> Base de Datos >  >> RDS >> Oracle

¿Entiendo mal las uniones?

Tienes razón en tu descripción del n.º 1... el problema con tu consulta está en el paso n.º 2.

Cuando haces una left join del reino a (familia y especie), está solicitando todos los reinos, incluso si no hay coincidencias (familia y especie)... sin embargo, esto no le devolverá ninguna combinación (familia y especie) que no tenga un reino coincidente.

Una consulta más cercana sería:

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 la left join fue reemplazado por una full join ...

sin embargo, esto solo devuelve familias que están asociadas con una especie... no devuelve ninguna familia que esté asociada con reinos pero no con especies.

Después de volver a leer tu pregunta, esto es realmente lo que querías...

EDITAR:Pensándolo mejor, podría volver a escribir su consulta así:

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;

Creo que esto sería preferible, porque eliminas RIGHT JOIN , que generalmente están mal vistos por tener un estilo deficiente... y los paréntesis, que pueden ser difíciles de analizar correctamente para determinar cuál será el resultado.