Tento článek poskytuje přehled CROSS JOIN
v SQL a také některé základní příklady.
SQL CROSS JOIN
(nebo FULL OUTER JOIN
) vrátí řádky, které kombinují každý řádek z první tabulky s každým řádkem z druhé tabulky.
Jinými slovy, vrací kartézský součin řádků z tabulek ve spojení.
Syntaxe
Křížové spojení určíte v FROM
doložka.
Syntaxe vypadá takto:
SELECT *
FROM Table1 CROSS JOIN Table2
ON Table1.Column = Table2.Column;
Příklad 1
Zde je příklad k demonstraci.
Ukázková data
Za prvé, zde jsou tabulky, které použijeme jako příklad.
t1
tabulka:
+--------+ | col1 | |--------| | a | | b | | c | +--------+
t2
tabulka:
+--------+ | col1 | |--------| | 1 | | 2 | | 3 | +--------+
Dotaz Cross Join
Zde je příklad provedení křížového spojení proti těmto dvěma tabulkám.
SELECT * FROM t1
CROSS JOIN t2;
Výsledek:
+--------+--------+ | col1 | col1 | |--------+--------| | a | 1 | | b | 1 | | c | 1 | | a | 2 | | b | 2 | | c | 2 | | a | 3 | | b | 3 | | c | 3 | +--------+--------+ (9 rows affected)
Náš dotaz tedy vrátí 9 řádků, i když v každé tabulce jsou pouze 3 řádky.
Je to kvůli tomu, jak funguje křížové spojení. Počet vrácených řádků je počet řádků v levé tabulce vynásobený počtem řádků v pravé tabulce.
Podívejte se, jak iteruje levou tabulkou a vypisuje každý řádek v pravé tabulce pro každý řádek v levé tabulce.
To má stejný účinek jako následující:
SELECT * FROM t1, t2
Výsledek:
+--------+--------+ | col1 | col1 | |--------+--------| | a | 1 | | b | 1 | | c | 1 | | a | 2 | | b | 2 | | c | 2 | | a | 3 | | b | 3 | | c | 3 | +--------+--------+ (9 rows affected)
Příklad 2
Co se stane, když přidáme WHERE
klauzule k našemu křížovému spojení.
SELECT * FROM t1
CROSS JOIN t2
WHERE t1.col1 = 'a';
Výsledek:
+--------+--------+ | col1 | col1 | |--------+--------| | a | 1 | | a | 2 | | a | 3 | +--------+--------+ (3 rows affected)
Příklad 3
Předpokládejme, že máme následující tabulky.
PetTypes
tabulka:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Pets
tabulka:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
V tomto případě Pets.PetTypeId
sloupec je cizí klíč PetTypes.PetTypeId
sloupec.
Nyní je zde příklad spuštění křížového spojení na těchto dvou tabulkách, ale pomocí WHERE
doložka.
SELECT
p.PetName,
pt.PetType
FROM Pets p
CROSS JOIN PetTypes pt
WHERE p.PetTypeId = pt.PetTypeId;
Výsledek:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
Přidání WHERE
klauzule ke křížovému spojení z něj udělala vnitřní spojení.
Zde je to, co se stane, když odstraníme WHERE
doložka.
SELECT
p.PetName,
pt.PetType
FROM Pets p
CROSS JOIN PetTypes pt;
Výsledek:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Bird | | Fetch | Bird | | Scratch | Bird | | Wag | Bird | | Tweet | Bird | | Fluffy | Bird | | Bark | Bird | | Meow | Bird | | Fluffy | Cat | | Fetch | Cat | | Scratch | Cat | | Wag | Cat | | Tweet | Cat | | Fluffy | Cat | | Bark | Cat | | Meow | Cat | | Fluffy | Dog | | Fetch | Dog | | Scratch | Dog | | Wag | Dog | | Tweet | Dog | | Fluffy | Dog | | Bark | Dog | | Meow | Dog | | Fluffy | Rabbit | | Fetch | Rabbit | | Scratch | Rabbit | | Wag | Rabbit | | Tweet | Rabbit | | Fluffy | Rabbit | | Bark | Rabbit | | Meow | Rabbit | +-----------+-----------+ (32 rows affected)
Dostaneme křížové spojení, které vrátí 32 řádků.