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