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.