SQL Server 交叉连接返回两个表的笛卡尔积。笛卡尔积表示表 1 中的行数乘以表 2 中的行数。
交叉连接不需要任何公共列来连接两个表。让我们通过笛卡尔连接的视觉表示来更好地理解。

从上面的截图,您可以很容易地理解交叉连接显示了两个表的笛卡尔积。这意味着表 A 中的每一条记录都与表 B 中的每一条记录组合在一起。
SQL Server 交叉连接语法
交叉连接的语法如下所示。
SELECT Table1.Column(s), Table2.Column(s),
FROM Table1
CROSS JOIN
Table2
--OR We can Simply Write it as
SELECT Table1. Column(s), Table2. Column(s),
FROM Table1, Table2
此示例中,我们使用两个表(Employee 和 Department)。Employee 表中存在的数据

SQL Server Department 表中存在的数据是:

SQL 交叉连接 Select * 示例
以下查询将显示所有现有的员工和部门表列。
SELECT * FROM [Employee] CROSS JOIN [Department];
如果您观察下面的连接截图,它显示了 120 条记录。这意味着 Employee 表中的 15 行乘以 Department 表中的 8 行。

注意:我建议您选择单个列名。请避免使用 SELECT * 语句,以避免出现 id、DeptID、id 等不需要的列。
选择部分列示例
如前所述,请在 SELECT 语句后选择所需的列,以避免不需要的列。例如,以下查询将显示 Employee 和 Department 表中列的笛卡尔积。
SELECT [FirstName]
,[LastName]
,[DepartmentName]
FROM [Employee]
CROSS JOIN [Department]

SQL 交叉连接中的歧义列
如果两个表(Employee 和 Department)中的列名不同,如上所示,则上述 Transact 查询将完美运行。但是,如果两个表中存在相同的列名会怎样?那么,使用上述方法,您将遇到错误。
让我向您展示一个实际示例。我们从 Department 表中添加了 id 作为上述查询的附加列。
SELECT [FirstName]
,[LastName]
,id
,[DepartmentName]
FROM [Employee]
CROSS JOIN [Department]
如您所见,交叉连接抛出错误:Ambiguous column name id(歧义列名 id)。id 列同时存在于 Employee 表和 Department 表中。服务器不知道您要检索哪个列。

为了解决这些问题,您必须在列名前使用表名。例如,以下查询在列名前使用了 ALIAS 表名。通过这种方法,我们可以通知服务器我们正在查找属于 Department 表的 id 列。
我们可以将上述交叉连接查询修改为如下所示,以解决歧义列错误:
SELECT Emp.[FirstName]
,Emp.[LastName]
,Dept.id
,Dept.[DepartmentName]
FROM [Employee] AS Emp
CROSS JOIN
[Department] AS Dept

您也可以省略关键字来获取结果。
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp,
CROSS JOIN
[Department] AS Dept
--OR We Can simply Write it as
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp,
[Department] AS Dept

SQL 交叉连接 Where 子句
我们可以使用 Where 子句来限制返回的行数。所以,这里我们将 WHERE 子句与它一起使用。
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp,
[Department] AS Dept
WHERE Dept.[DepartmentName] = 'Software Developer'

Order By 子句示例
它允许我们使用 Order By 子句来重新排列记录的顺序。
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp,
[Department] AS Dept
ORDER BY [FirstName], [LastName], [DepartmentName]
