Poslední úpravy - Vyhledat:

SQL

O modelování

Power Designer

Oracle Data Modeler

Krátká videa DM

Zdroje...

edit SideBar

SQL /

Vnìj¹í spojení

< Spojeni tabulek | SQL postupnì | Self join >

Vypí¹eme-li v¹echny kódy zbo¾í z tabulky ZBOZ, dostaneme 27 øádkù. Vypí¹eme-li v¹echny rùzné kódy zbo¾í z tabulky POLOZ, dostaneme 26 øádkù. To proto, ¾e jeden druh zbo¾í (s kódem 1012) nebyl nikdy nakoupen. Pokud propojíme tabulky ZBOZ a POLOZ pøes kód zbo¾í KOD, zbo¾í s kódem 1012 nebude s èím spojit, a ve výsledku nebude.

Pokud chceme do výsledku dostat v¹echny záznamy nìjaké tabulky, a» u¾ je v druhé tabulce s èím je spojit nebo není, musíme pou¾ít jiný druh propojení, tzv. vnìj¹í spojení. Pou¾ívají se klíèová slova left nebo right pøed slovem join.

Pøíklad: Vypi¹te v¹echny kódy a názvy zbo¾í a ke ka¾dému vypi¹te èísla objednávek a objednaná mno¾ství.

        select KOD, NAZ,CISO,MNOZ
        from ZBOZ left join POLOZ using (KOD)
        order by 1,3;
To, ¾e se do výsledku dostanou v¹echna zbo¾í, je zpùsobeno klíèovým slovem left pøed klíèovým slovem join. Stejný výsledek dá následující formulace:
        select KOD, NAZ,CISO,MNOZ
        from POLOZ right join ZBOZ using (KOD)
        order by 1,3;
Zmìna je v poøadí, v jakém jsou tabulky v klauzuli FROM zapsané. left se týká tabulky nalevo, right napravo. (V¾dy se ale toto klíèové slovo pí¹e pøed slovem join.) Záznamy tabulky, které se to týká (v obou na¹ich pøípadech je to tabulka ZBOZ), se dostanou do výsledku v¹echny.

Výsledek pøedchozího dotazu také ukazuje, co se dostane do výsledku do sloupcù, do kterých není co dát. Je tam prázdná (NULL) hodnota.

Tento postøeh se dá pou¾ít také ke konstrukci dotazù k nalezení toho, co není ( k tìmto dotazùm se tento tutoriál propracuje).

Co kdy¾ navíc máme podmínku na to, které øádky propojit?


Pøíklad: Vypi¹te v¹echny kódy a názvy zbo¾í a ke ka¾dému vypi¹te èísla objednávek a objednaná mno¾ství z období 1.1.2008 - 31.3.2008.

        select KOD, NAZ,CISO,MNOZ
        from ZBOZ left join POLOZ using (KOD) left join OBJ on (POLOZ.CISO=OBJ.CISO and DAT between '01012008' and '31032008')
        order by 1,3;
Podmínku DAT between '01012008' and '31032008' nebylo správné dát do klauzule WHERE, porovnejte (¹patnì):
        select KOD, NAZ,CISO,MNOZ
        from ZBOZ left join POLOZ using (KOD) left join OBJ using (CISO)
        where DAT between '01012008' and '31032008'
        order by 1,3;
Dostali jsme jen zbo¾í, pro které v tomto období nìjaké objednávka existovala. Jen u nich je toti¾ ve výsledku propojení z klauzule FROM ve sloupci DAT hodnota splòující po¾adovanou podmínku.

V pøípadì vnìj¹ího spojení se klauzule WHERE vyhodnocuje a¾ na výsledku propojení z klauzule FROM.

< Spojeni tabulek | SQL postupnì | Self join >

Upravit - Historie - Tisk - Poslední úpravy - Vyhledat
Poslední úprava stránky: 28.12.2011, 11:21