交叉加入
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