Microsoft SQL Server Cross Join


Esempio

A cross join è un join cartesiano, che significa un prodotto cartesiano di entrambi i tavoli. Questo join non ha bisogno di alcuna condizione per unire due tabelle. Ogni riga nella tabella di sinistra si unirà a ciascuna riga della tabella di destra. Sintassi per un cross join:

SELECT * FROM table_1
CROSS JOIN table_2 

Esempio:

/* Sample data. */
DECLARE @Animal table (
    AnimalId Int IDENTITY,
    Animal Varchar(20)
);

DECLARE @AnimalSound table (
    AnimalSoundId Int IDENTITY,
    AnimalId Int,
    Sound Varchar(20)
);

INSERT INTO @Animal (Animal) VALUES ('Dog');
INSERT INTO @Animal (Animal) VALUES ('Cat');
INSERT INTO @Animal (Animal) VALUES ('Elephant');

INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (1, 'Barks');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (2, 'Meows');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (3, 'Trumpet');
/* Sample data prepared. */

SELECT 
    * 
FROM 
    @Animal 
    CROSS JOIN @AnimalSound;

risultati:

AnimalId    Animal               AnimalSoundId AnimalId    Sound
----------- -------------------- ------------- ----------- --------------------
1           Dog                  1             1           Barks
2           Cat                  1             1           Barks
3           Elephant             1             1           Barks
1           Dog                  2             2           Meows
2           Cat                  2             2           Meows
3           Elephant             2             2           Meows
1           Dog                  3             3           Trumpet
2           Cat                  3             3           Trumpet
3           Elephant             3             3           Trumpet

Nota che ci sono altri modi in cui un CROSS JOIN può essere applicato. Questo è un join "vecchio stile" (deprecato dal ANSI SQL-92) senza condizione, che risulta in un cross / Cartesian join:

SELECT * 
FROM @Animal, @AnimalSound;

Questa sintassi funziona anche a causa di una condizione di join "sempre true", ma non è raccomandata e dovrebbe essere evitata, a favore della sintassi CROSS JOIN esplicita, per motivi di leggibilità.

SELECT * 
FROM 
    @Animal 
    JOIN @AnimalSound 
        ON 1=1