Poslední úpravy - Vyhledat:

SQL

O modelování

Power Designer

Oracle Data Modeler

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, 12:21