Questo articolo fornisce una panoramica del CROSS JOIN
in SQL, oltre ad alcuni esempi di base.
Il CROSS JOIN
di SQL (o FULL OUTER JOIN
) restituisce righe che combinano ogni riga della prima tabella con ogni riga della seconda tabella.
In altre parole, restituisce il prodotto cartesiano delle righe delle tabelle nel join.
Sintassi
Specificare un cross join nel FROM
clausola.
La sintassi è questa:
SELECT *
FROM Table1 CROSS JOIN Table2
ON Table1.Column = Table2.Column;
Esempio 1
Ecco un esempio da dimostrare.
Dati di esempio
Innanzitutto, ecco le tabelle che useremo per l'esempio.
Il t1
tabella:
+--------+ | col1 | |--------| | a | | b | | c | +--------+
Il t2
tabella:
+--------+ | col1 | |--------| | 1 | | 2 | | 3 | +--------+
La query di unione incrociata
Ecco un esempio di esecuzione di un cross join su queste due tabelle.
SELECT * FROM t1
CROSS JOIN t2;
Risultato:
+--------+--------+ | col1 | col1 | |--------+--------| | a | 1 | | b | 1 | | c | 1 | | a | 2 | | b | 2 | | c | 2 | | a | 3 | | b | 3 | | c | 3 | +--------+--------+ (9 rows affected)
Quindi la nostra query restituisce 9 righe, anche se ci sono solo 3 righe in ogni tabella.
Ciò è dovuto al modo in cui funziona il cross join. Il numero di righe restituito è il numero di righe nella tabella di sinistra, moltiplicato per il numero di righe nella tabella di destra.
Guarda come scorre la tabella di sinistra, generando ogni riga nella tabella di destra per ogni riga nella tabella di sinistra.
Questo ha lo stesso effetto delle seguenti operazioni:
SELECT * FROM t1, t2
Risultato:
+--------+--------+ | col1 | col1 | |--------+--------| | a | 1 | | b | 1 | | c | 1 | | a | 2 | | b | 2 | | c | 2 | | a | 3 | | b | 3 | | c | 3 | +--------+--------+ (9 rows affected)
Esempio 2
Ecco cosa succede se aggiungiamo un WHERE
clausola al nostro cross join.
SELECT * FROM t1
CROSS JOIN t2
WHERE t1.col1 = 'a';
Risultato:
+--------+--------+ | col1 | col1 | |--------+--------| | a | 1 | | a | 2 | | a | 3 | +--------+--------+ (3 rows affected)
Esempio 3
Supponiamo di avere le seguenti tabelle.
I PetTypes
tabella:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Gli Pets
tabella:
+---------+-------------+-----------+-----------+------------+ | 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)
In questo caso, il Pets.PetTypeId
column è una chiave esterna di PetTypes.PetTypeId
colonna.
Ora, ecco un esempio di esecuzione di un cross join su queste due tabelle, ma utilizzando un WHERE
clausola.
SELECT
p.PetName,
pt.PetType
FROM Pets p
CROSS JOIN PetTypes pt
WHERE p.PetTypeId = pt.PetTypeId;
Risultato:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
Aggiungendo il WHERE
la clausola al cross join l'ha trasformata in un inner join.
Ecco cosa succede se rimuoviamo WHERE
clausola.
SELECT
p.PetName,
pt.PetType
FROM Pets p
CROSS JOIN PetTypes pt;
Risultato:
+-----------+-----------+ | 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)
Otteniamo un cross join che restituisce 32 righe.