Poslední úpravy - Vyhledat:

SQL

O modelování

Power Designer

Oracle Data Modeler

Krátká videa DM

Zdroje...

edit SideBar

SQL /

Spojení tabulek

< Poøadí øádkù | SQL postupnì | Vnìj¹í spojení >

V dotazu mù¾eme po¾adovat jen sloupce z tabulek uvedených v klauzuli FROM; nìkdy potøebujeme je¹tì dal¹í tabulky. A¾ na výjimky musíme specifikovat propojení tabulek.
Napøíklad mù¾eme chtít pro ka¾dého zákazníka vypsat rùzné názvy zbo¾í, které kdy nakoupil. Potøebujeme tedy nìco o zákazníkovi, asi login jako¾to identifikátor, a pak napøíklad jméno a pøíjmení. Dále potøebujeme ty názvy zbo¾í. Tak¾e tabulky ZAK a ZBOZ jsou nutné. To ale nestaèí, mezi záznamy tìchto dvou tabulek není pøímá souvislost, ta vzniká tím, ¾e k zákazníkovi najdeme v¹echny jeho objednávky, ke ka¾dé objednávce v¹echny její polo¾ky, a ke ka¾dé polo¾ce pøíslu¹né zbo¾í. Je tedy tøeba propojit postupnì ZAK, OBJ, POLOZ a ZBOZ.
Pro zadání pøíkazu databázovému systému by to je¹tì nebylo dostateèné. Musíme urèit, jak se ta propojení mají udìlat. V SQL se propojení specifikují podmínkami propojení, tj. jaký vzájemný vztah musí platit, aby záznamy byly propojeny. Nejèastìj¹í pøípad je, ¾e má jít o shodu mezi hodnotou ve sloupci (èi sloupcích) prvního záznamu a hodnotou ve sloupci (èi sloupcích) druhé tabulky. Tak napøíklad v na¹em pøípadì propojení zákazníkových objednávek k zákazníkovi se jedná o shodu mezi hodnotou v poli LOG tabulky ZAK a hodnotou v poli ZAK tabulky OBJ. Pøíslu¹ná podmínka má formu (LOG=ZAK). V pøípadì, ¾e pole, která se mají porovnávat, se jmenují stejnì, jako napøíklad CISO v tabulce OBJ a CISO v tabulce POLOZ, lze v SQL pøíslu¹nou podmínku formulovat zkrácenì. Pou¾ije se jiné klíèové slovo, USING. Dohromady vypadá klauzule FROM pro ná¹ pøíklad takto:
   from ZAK join OBJ on(LOG=ZAK) join POLOZ using (CISO) join ZBOZ using (KOD)

Dobøe lze podobu této èásti pøíkazu vyèíst ze schématu, kdy¾ jdeme "cestou" od poèáteèní tabulky ke koneèné. (Kterou zvolíme za poèáteèní a kterou za koneènou, je jedno.) ©ipky pøedstavující vazby cizích klíèù nám slou¾í jako nápovìda, proto¾e propojují pole, která se mají porovnávat. Nakonec celý pøíkaz vypadá takto:


Pøíklad: Pro zákazníky, kteøí nìkdy nakoupili, vypi¹te login, jméno, pøíjmení a rùzné názvy zbo¾í, které kdy nakoupili.

        select distinct LOG,ZAK.JMEN,ZAK.PRIJM,NAZ
        from ZAK join OBJ on(LOG=ZAK) join POLOZ using (CISO) join ZBOZ using (KOD)
        order by 1;

Tabulky, které nepotøebujeme, do dotazu nepatøí. V opaèném pøípadì buï pouze dotaz zpomalíme, nebo zmìníme výsledek.

Pøíklad: Pro zákazníky, kteøí nìkdy nakoupili, vypi¹te pouze login a rùzné názvy zbo¾í, které kdy nakoupili.

        select distinct ZAK,NAZ
        from OBJ join POLOZ using (CISO) join ZBOZ using (KOD)
        order by 1;
Tabulka ZAK zde není potøeba.

Pøíklad: Pro zákazníky, kteøí nìkdy nakoupili, vypi¹te login, èíslo objednávky a datum objednávky. Øaïte podle zákazníkù a data.

        select ZAK,CISO, DAT
        from OBJ
        order by 1,3;
Pokud bychom pøipojili i tabulku POLOZ, dostaneme pøíli¹ mnoho øádkù:
        select ZAK,CISO, DAT
        from OBJ join POLOZ using (CISO)
        order by 1,3;

Pøíklad: Pro kategorie, ve kterých máme nìjaké zbo¾í, vypi¹te názvy zbo¾í v této kategorii.

        select KAT, NAZ
        from ZBOZ
        order by 1,2;
Kdy¾ bychom pøidali i tabulku POLOZ, budou se nìkteré øádky opakovat a jiné chybìt:
        select KAT, NAZ
        from ZBOZ join POLOZ using (KOD)
        order by 1,2;
Kdy¾ pøidáme distinct,
        select distinct KAT, NAZ
        from ZBOZ join POLOZ using (KOD)
        order by 1,2;
vidíme, ¾e chybí Fanta divoká malina. Nikdy ji nikdo nekoupil. Záhadu tohoto posledního pøíkladu objasní následující kapitola.

< Poøadí øádkù | SQL postupnì | Vnìj¹í spojení >

Upravit - Historie - Tisk - Poslední úpravy - Vyhledat
Poslední úprava stránky: 20.10.2009, 17:40