Skoro každý se setkal s jazykem SQL a jedním z jeho příkazů JOIN pro spojení řádků dvou tabulek do jedné. Bohužel ne všichni mají 100% jasno jak příkaz používat a jak využít jeho varianty v Microsoft SQL Serveru.
Základní syntaxe příkazu je:
SELECT * FROM Tabulka1 JOIN Tabulka2 ON Tabulka1.Sloupec = Tabulka2.Sloupec
Ta vybere kombinace řádků z tabulky Tabulka1 a Tabulka2, které mají shodnou hodnotu sloupce Sloupec. Místo klíčového slova JOIN však můžeme použít i LEFT JOIN, FULL JOIN nebo RIGHT JOIN. Každá z těchto variant může ovlivnit počet i hodnotu výsledků. Celé to lze znázornit jako průniky množit hodnot:
Platí, že pokud použijeme vnitřní join, tak vždy dostaneme data, která mají platné hodnoty z obou tabulek. Použití vnějšího joinu znamená, že hodnoty z původní tabulky (FULL JOIN a RIGHT JOIN) nebo z připojované (FULL JOIN a LEFT JOIN) můžou být NULL, pokud se nenalezne odpovídající kombinace pomocí propojovacího pravidla.
Nejlépe je vše vidět na příkladu. Připravil jsem proto ukázkový kód všech typů JOINů, který si můžete pustit proti SQL Serveru:
-- vytvořit tabulky
create table #tbl (a int, txt nvarchar(100))
go
create table #tbl2 (a int, txt nvarchar(100))
go
-- naplnit puvodni tabulku
insert into #tbl values ( 2, N'2 je dělitelné 2' )
insert into #tbl values ( 4, N'4 je dělitelné 2' )
insert into #tbl values ( 6, N'6 je dělitelné 2' )
-- naplnit tabulku, kterou budeme pripojovat
insert into #tbl2 values ( 3, N'3 je dělitelné 3' )
insert into #tbl2 values ( 6, N'6 je dělitelné 3' )
-- DOTAZ 1 - vybrat jen odpovídajíci kombinace (společné jsou jen řádky s číslem 6)
select #tbl.a, #tbl.txt, #tbl2.txt from #tbl inner join #tbl2 on #tbl.a = #tbl2.a
-- DOTAZ 2 - vybrat všechny řádky z první tabulky + k odpovídajícím kombinacím i z druhé
select #tbl.a, #tbl.txt, #tbl2.txt from #tbl left outer join #tbl2 on #tbl.a = #tbl2.a
-- DOTAZ 3 - vybrat vše z obou tabulek a spojit případné kombinace
select #tbl.a, #tbl.txt, #tbl2.txt from #tbl full outer join #tbl2 on #tbl.a = #tbl2.a
-- DOTAZ 4 - vybrat všechny řádky z druhé tabulky + k odpovídajícím kombinacím i z první
select #tbl.a, #tbl.txt, #tbl2.txt from #tbl right outer join #tbl2 on #tbl.a = #tbl2.a
go
-- zrušit tabulky
drop table #tbl
go
drop table #tbl2
go