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, 14:52