SQL 交叉连接 (CROSS JOIN)

SQL Server 交叉连接返回两个表的笛卡尔积。笛卡尔积表示表 1 中的行数乘以表 2 中的行数。

交叉连接不需要任何公共列来连接两个表。让我们通过笛卡尔连接的视觉表示来更好地理解。

Cartesian product diagram

从上面的截图,您可以很容易地理解交叉连接显示了两个表的笛卡尔积。这意味着表 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 表中存在的数据

Left Table Data

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

Right Table data

SQL 交叉连接 Select * 示例

以下查询将显示所有现有的员工和部门表列。

SELECT * FROM [Employee]
   CROSS JOIN [Department];

如果您观察下面的连接截图,它显示了 120 条记录。这意味着 Employee 表中的 15 行乘以 Department 表中的 8 行。

SQL CROSS JOIN Select * 3

注意:我建议您选择单个列名。请避免使用 SELECT * 语句,以避免出现 id、DeptID、id 等不需要的列。

选择部分列示例

如前所述,请在 SELECT 语句后选择所需的列,以避免不需要的列。例如,以下查询将显示 Employee 和 Department 表中列的笛卡尔积。

SELECT [FirstName]
      ,[LastName]
      ,[DepartmentName]
FROM [Employee]
   CROSS JOIN [Department]
CROSS JOIN to Select few Columns 4

SQL 交叉连接中的歧义列

如果两个表(Employee 和 Department)中的列名不同,如上所示,则上述 Transact 查询将完美运行。但是,如果两个表中存在相同的列名会怎样?那么,使用上述方法,您将遇到错误。

让我向您展示一个实际示例。我们从 Department 表中添加了 id 作为上述查询的附加列。

SELECT [FirstName]
      ,[LastName]
      ,id
      ,[DepartmentName]
FROM [Employee]
   CROSS JOIN [Department]

如您所见,交叉连接抛出错误:Ambiguous column name id(歧义列名 id)。id 列同时存在于 Employee 表和 Department 表中。服务器不知道您要检索哪个列。

Ambiguous Column Name Error 5

为了解决这些问题,您必须在列名前使用表名。例如,以下查询在列名前使用了 ALIAS 表名。通过这种方法,我们可以通知服务器我们正在查找属于 Department 表的 id 列。

我们可以将上述交叉连接查询修改为如下所示,以解决歧义列错误:

SELECT Emp.[FirstName]
      ,Emp.[LastName]
      ,Dept.id
      ,Dept.[DepartmentName]
FROM [Employee] AS Emp
CROSS JOIN
     [Department] AS Dept
Remove Ambiguous Column Error 6

您也可以省略关键字来获取结果。

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'
CROSS JOIN Where Clause 2

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]