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