Ano, používám všechny tři tyto JOINy, i když mám tendenci používat pouze LEFT (OUTER) JOIN s místo vzájemného míchání LEFT a RIGHT JOIN. Také používám FULL OUTER JOIN s a CROSS JOIN s.
Stručně řečeno, INNER JOIN omezuje resultset pouze na ty záznamy, které splňují podmínku JOIN. Zvažte následující tabulky
UPRAVIT: Přejmenoval jsem názvy tabulek a předponu jim @ takže proměnné tabulky lze použít pro každého, kdo čte tuto odpověď a chce experimentovat.
Pokud s tím také chcete experimentovat v prohlížeči, Všechno jsem to nastavil na SQL Fiddle také;
@Table1
id | name
---------
1 | One
2 | Two
3 | Three
4 | Four
@Table2
id | name
---------
1 | Partridge
2 | Turtle Doves
3 | French Hens
5 | Gold Rings
SQL kód
DECLARE @Table1 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
INSERT INTO @Table1 VALUES(1, 'One');
INSERT INTO @Table1 VALUES(2, 'Two');
INSERT INTO @Table1 VALUES(3, 'Three');
INSERT INTO @Table1 VALUES(4, 'Four');
DECLARE @Table2 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
INSERT INTO @Table2 VALUES(1, 'Partridge');
INSERT INTO @Table2 VALUES(2, 'Turtle Doves');
INSERT INTO @Table2 VALUES(3, 'French Hens');
INSERT INTO @Table2 VALUES(5, 'Gold Rings');
INNER JOIN Příkaz SQL spojený s id pole
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
Výsledky v
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
LEFT JOIN vrátí sadu výsledků se všemi záznamy z tabulky na levé straně spojení (pokud byste příkaz zapsali jako jeden řádek, tabulka, která se zobrazí jako první) a pole z tabulky na pravé straně spojení které odpovídají výrazu spojení a jsou zahrnuty v SELECT doložka. Chybí podrobnosti budou vyplněny hodnotou NULL
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
LEFT JOIN
@Table2 t2
ON
t1.id = t2.id
Výsledky v
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
4 | Four | NULL
RIGHT JOIN má stejnou logiku jako LEFT JOIN ale vrátí všechny záznamy z pravé strany spojení a pole z levé strany, která odpovídají výrazu spojení a jsou zahrnuta v SELECT doložka.
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
RIGHT JOIN
@Table2 t2
ON
t1.id = t2.id
Výsledky v
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
NULL| NULL| Gold Rings
Samozřejmostí je také FULL OUTER JOIN , která zahrnuje záznamy z obou spojených tabulek a vyplní všechny chybějící podrobnosti s NULL.
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
FULL OUTER JOIN
@Table2 t2
ON
t1.id = t2.id
Výsledky v
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
4 | Four | NULL
NULL| NULL| Gold Rings
A CROSS JOIN (známé také jako CARTESIAN PRODUCT ), což je jednoduše produkt křížového použití polí v SELECT příkaz z jedné tabulky s poli v SELECT výpis z druhé tabulky. Všimněte si, že CROSS JOIN neobsahuje žádný spojovací výraz
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
CROSS JOIN
@Table2 t2
Výsledky v
id | name | name
------------------
1 | One | Partridge
2 | Two | Partridge
3 | Three | Partridge
4 | Four | Partridge
1 | One | Turtle Doves
2 | Two | Turtle Doves
3 | Three | Turtle Doves
4 | Four | Turtle Doves
1 | One | French Hens
2 | Two | French Hens
3 | Three | French Hens
4 | Four | French Hens
1 | One | Gold Rings
2 | Two | Gold Rings
3 | Three | Gold Rings
4 | Four | Gold Rings
UPRAVIT:
Představte si, že nyní existuje Tabulka 3
@Table3
id | name
---------
2 | Prime 1
3 | Prime 2
5 | Prime 3
SQL kód
DECLARE @Table3 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
INSERT INTO @Table3 VALUES(2, 'Prime 1');
INSERT INTO @Table3 VALUES(3, 'Prime 2');
INSERT INTO @Table3 VALUES(5, 'Prime 3');
Nyní jsou všechny tři stoly spojeny pomocí INNER JOINS
SELECT
t1.id,
t1.name,
t2.name,
t3.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
INNER JOIN
@Table3 t3
ON
t1.id = t3.id
Výsledky v
id | name | name | name
-------------------------------
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
Tomuto výsledku by mohlo pomoci pochopit, že záznamy s ID 2 a 3 jsou jediné společné všem 3 tabulkám a jsou také pole, na kterém se připojujeme ke každému stolu.
Nyní všechny tři s LEFT JOINS
SELECT
t1.id,
t1.name,
t2.name,
t3.name
FROM
@Table1 t1
LEFT JOIN
@Table2 t2
ON
t1.id = t2.id
LEFT JOIN
@Table3 t3
ON
t1.id = t3.id
Výsledky v
id | name | name | name
-------------------------------
1 | One | Partridge | NULL
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
4 | Four | NULL | NULL
Joelova odpověď je dobrým vysvětlením pro vysvětlení této sady výsledků (Tabulka1 je základní/původní tabulka).
Nyní s INNER JOIN a LEFT JOIN
SELECT
t1.id,
t1.name,
t2.name,
t3.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
LEFT JOIN
@Table3 t3
ON
t1.id = t3.id
Výsledky v
id | name | name | name
-------------------------------
1 | One | Partridge | NULL
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
Přestože neznáme pořadí, ve kterém bude optimalizátor dotazů provádět operace, podíváme se na tento dotaz shora dolů, abychom porozuměli množině výsledků. INNER JOIN on ids mezi Tabulkou1 a Tabulkou2 omezí sadu výsledků pouze na ty záznamy, které splňují podmínku spojení, tj. na tři řádky, které jsme viděli v úplně prvním příkladu. Toto dočasné resultset pak bude LEFT JOIN ed to Table3 na ids mezi Table1 and Tables; V tabulce 3 jsou záznamy s id 2 a 3, ale ne id 1, takže pole t3.name bude obsahovat podrobnosti pro 2 a 3, ale ne 1.