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