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
... 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.