Poslední úpravy - Vyhledat:

SQL

O modelování

Power Designer

Oracle Data Modeler

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, 19:40