sql >> Databáze >  >> RDS >> Oracle

Chápu špatně spoje?

Máte pravdu s popisem č. 1... problém s vaším dotazem je v kroku č. 2.

Když provedete left join z království do (rodina &druh), požadujete každé království, i když neexistuje žádná odpovídající (rodina &druh)... toto vám však nevrátí žádnou kombinaci (rodina &druh), která nemá odpovídající království.

Bližší dotaz by byl:

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;

Všimněte si, že left join bylo nahrazeno full join ...

toto však vrací pouze rodiny, které jsou spojeny s určitým druhem... nevrací žádné rodiny, které jsou spojeny s královstvími, ale ne s druhy.

Po opětovném přečtení vaší otázky je to vlastně to, co jste chtěli...

EDIT:Při dalším zamyšlení můžete svůj dotaz přepsat takto:

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;

Myslím, že by to bylo vhodnější, protože eliminujete RIGHT JOIN , které jsou obvykle odsuzovány pro jejich špatný styl... a závorky, které mohou být pro lidi složité správně analyzovat, aby určili, jaký bude výsledek.



  1. Optimalizace postgresového dotazu na podobnost (pg_trgm + gin index)

  2. NA VYMAZÁNÍ KASKÁDY

  3. Způsob, jak přerušit provádění skriptů MySQL (možná vyvolání chyby)?

  4. Migrace databáze Oracle do MySQL na AWS, část 2