|
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í.
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 .
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í.
< Vnější spojení | SQL postupně | Agregace > Obsah: |