Hai ragione sulla tua descrizione del n. 1... il problema con la tua query è al passaggio n. 2.
Quando esegui un left join
da regno a (famiglia e specie), stai richiedendo ogni regno, anche se non c'è corrispondenza (famiglia e specie)... tuttavia, questo non ti restituirà alcuna combinazione (famiglia e specie) che non abbia una regno corrispondente.
Una query più ravvicinata sarebbe:
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;
Nota che il left join
è stato sostituito con un full join
...
tuttavia, questo restituisce solo le famiglie associate a una specie... non restituisce le famiglie associate ai regni ma non le specie.
Dopo aver riletto la tua domanda, questo è in realtà quello che volevi...
EDIT:Dopo aver riflettuto ulteriormente, potresti riscrivere la tua query in questo modo:
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;
Penso che questo sarebbe preferibile, perché elimini il RIGHT JOIN
, che di solito sono disapprovati per essere di cattivo gusto... e le parentesi, che possono essere difficili da analizzare correttamente per determinare quale sarà il risultato.