Poslední úpravy - Vyhledat:

SQL

O modelování

Power Designer

Oracle Data Modeler

Krátká videa DM

Zdroje...

edit SideBar

SQL /

Self JOIN

< Vnější spojení | SQL postupně | Agregace >

Někdy by nám pomohlo, kdybychom měli k dispozici dva exempláře téže tabulky, a ty mohli propojit nějakou určitou vazbou. Například dva exempláře tabulky KAT, propojených vazbou kategorie ke kategorii jí nadřízené.

Toto nám může sloužit jako představa, protože jazyk SQL takovou možnost poskytuje. Jen musíme oba "exempláře" od sebe odlišit, nějak je přejmenovat. Na to v jazyce SQL slouží konstrukce aliasů – ty se zapisují hned za název tabulky v klauzuli FROM, čímž je tato tabulka pro celý příkaz přejmenována. Její "staré" jméno se již v příkazu nedá použít (nebo bude znamenat něco jiného, než myslíme).


Příklad: Ke každé kategorii vypište kód kategorie a název, a kódy a názvy všech jí podřízených kategorií.

        select NAD.KAT as NAD,NAD.NAZK as NAD_NAZ,POD.KAT as POD, POD.NAZK as POD_NAZ
        from KAT NAD left join KAT POD on (NAD.KAT=POD.NADR)
        order by 1;
Sice stačilo přejmenovat jen jeden "exemplář" tabulky KAT, ale takto je kód přehlednější.

Takovýmto konstrukcím říkáme "self join". Nejedná se o nějaká další klíčové slovo v SQL, je to jen výraz odborného slangu databázistů. Že se jedná o self join říkáme vždy, když v dotazu máme jednu a téže tabulku v klauzuli FROM víckrát.

Většinu smysluplných self joinů konstruujeme v případech nějakého vztahu nadřízenosti. Pak nás napadne, jak bychom vypsali celou hierarchii? S tím je v SQL potíž. Problém je v tom, že nevíme, kolik úrovní strom hierarchie má, a také všechny větve nemusí být stejně dlouhé. V našem případě má kategorie nápojů dvě podkategorie, z nichž každá má ještě svoji další podpodkategorii. Ale kategorie pečivo a ovoce/zelenina již žádné podkategorie nemají.


Příklad: Ke každé kategorii, která má podkategorii, a ta má také podkategorii, vypište kód kategorie, kód podřízené kategorie, a kód podřízené podřízené kategorie .

        select NADNAD.KAT as KAT1, NAD.KAT as KAT2, KAT.KAT as KAT3 
        from KAT NADNAD join KAT NAD on (NADNAD.KAT=NAD.NADR) join KAT on(NAD.KAT=KAT.NADR)
        order by 1,2;
Takto jsme ovšem nedostali ovze a pec. Na ty je možné se dotázat:
        select KAT
        from KAT 
        where KAT not in (select NADR from KAT);
Ještě zbývají potenciální kategorie, pod kterými je pouze jedna úroveň (takové v naší cvičné databázi nejsou) a další potenciální, pod nimiž by bylo více než 2 úrovně (takové v naší cvičné databázi také nejsou).

Je vidět, že propátrání hierachie je velmi pracné. Standard SQL99 sice určitý nástroj poskytuje, ale zdaleka ne všechny databázové systémy ho mají ve své výbavě. Jedná se o rekurzívní SELECT:


Příklad: Vypište všechny podkategorie kategorie "nap" včetně úrovně zanoření.

        select LEVEL,NADR,KAT 
        from KAT connect by prior KAT=NADR
        start with kat='nap'
        order by LEVEL;
Toto je syntaxe Oracle. Smyslupné využití vyžaduje prohledávání někde začít.

< Vnější spojení | SQL postupně | Agregace >

Upravit - Historie - Tisk - Poslední úpravy - Vyhledat
Poslední úprava stránky: 24.02.2010, 15:52