JOIN 表运算符对两个输入表进行操作。联接的类型有交叉联接、内部联接和外部联接,它们的区别在于如何应用逻辑查询处理阶段。交叉联接仅应用一个阶段——笛卡尔乘积,内部联接应用两个阶段——笛卡尔乘积和筛选,外部联接应用三个阶段——笛卡尔乘积、筛选和添加外部行。
交叉联接(CROSS JOIN)
交叉联接仅执行一个逻辑查询处理阶段——笛卡尔乘积,这一阶段对提供的两个输入表进行操作,联接并生成两个表的笛卡尔乘积(将一个输入表的每一行与另一个表的所有行匹配,得到m×n行)。
-- 如果为表分配了别名,那么使用完整表名称作为前缀是无效的
SELECT A.City, B.Company FROM Cities A CROSS JOIN Companies B -- 推荐
SELECT A.City, B.Company FROM Cities A, Companies B
自联接是指联接同一个表的多个实例,自联接被所有基本联接类型支持(交叉联接、内部联接、外部联接)。
-- 自联接中必须为表指定别名,否则联接结果中所有列名都将不明确
SELECT A.City, A.CityID, B.City, B.CityID FROM Cities A CROSS JOIN Cities B
交叉联接的一种用途是生成数字表(一个整数数列结果集)。
IF OBJECT_ID(N'dbo.Digits', 'U') IS NOT NULL
DROP TABLE dbo.Digits;
CREATE TABLE dbo.Digits
(
digit INT NOT NULL <