交叉加入

A cross join 是笛卡尔连接,意思是两个表的笛卡尔积。此连接不需要任何条件来连接两个表。左表中的每一行都将连接到右表的每一行。交叉连接的语法:

SELECT * FROM table_1
CROSS JOIN table_2 

例:

/* 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;

结果:

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

请注意,还有其他方法可以应用 CROSS JOIN。这是一个 旧样式 连接(自 ANSI SQL-92 以来不推荐使用),没有条件,这导致交叉/笛卡尔连接:

SELECT * 
FROM @Animal, @AnimalSound;

由于始终为真的连接条件,此语法也有效,但为了便于阅读,不建议使用,应该避免使用显式的 CROSS JOIN 语法。

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