SQL Server CROSS JOIN

17 Mar 2025 | 5 分钟阅读

CROSS JOIN 通过组合两个或多个表的所有可能性来生成结果,其中包含所有贡献表中的每一行。 换句话说,它通过生成参与连接操作的所有表的每一行的配对组合来返回结果。 这种连接有时也被称为 **CARTESIAN JOIN**,它提供所有关联表的笛卡尔积。

**笛卡尔积**可以解释为存在于第一个表中的所有行乘以存在于第二个表中的所有行。 它类似于 INNER JOIN,此子句不提供连接条件。

我们可以通过以下视觉表示来理解它,其中 CROSS JOIN 返回 **table1** 和 **table2** 中的所有记录,并且第一个表的每一行与第二个表的每一行组合。

SQL Server CROSS JOIN

CROSS JOIN 语法

使用 SELECT 语句时,必须在 FROM 子句之后添加 CROSS JOIN 关键字。 使用以下语法检索来自两个连接表的所有记录

在上述语法中,**column_lists** 是您要返回的列或字段的名称,而 table1 和 table2 是您从中获取记录的表名。

注意:SQL Server 中的 Cross Join 不能将 ON 子句与 JOIN 条件一起使用。 但是,所有其他连接都可以将其与 Join 条件一起使用。 我们会遇到语法错误,我们尝试在 CROSS JOIN 上使用 ON 子句。

CROSS JOIN 示例

让我们通过示例了解 CROSS JOIN 在 SQL Server 中的工作原理。 假设我们有两个名为“**Student**”的表,其中包含学生信息,以及名为“**Fee**”的表,其中包含费用明细。 这是表输出

SQL Server CROSS JOIN

如果我们想从这两个表中获取所有记录,我们使用以下语句

执行上述记录后,我们将获得以下输出

SQL Server CROSS JOIN

当我们执行上述语句时,我们将观察到它显示了 40 行。 这意味着来自学生表的八行乘以来自费用表的五行。

在上面的输出图像中,我们注意到该表包含多个重复的列。 如果您想避免这种重复,建议使用单独的列名而不是 SELECT * 语句。

CROSS JOIN 中的歧义列问题

假设我们只想从所有参与表和这些表包含一些相同列名的表中检索选定的列。 在这种情况下,SQL Server **会抛出错误:列名模棱两可**。 这表示该列的名称出现在两个表中,并且 SQL Server 不确定您要检索哪一列。 以下示例可以帮助您更好地理解它

执行此语句将产生以下错误消息

SQL Server CROSS JOIN

但是,我们可以通过在列名之前指定表名来解决此问题。 因此,我们可以如下重写上述查询以删除此错误

执行查询将返回以下输出

SQL Server CROSS JOIN

带有 WHERE 子句的 CROSS JOIN

我们使用 WHERE 子句从表中检索过滤后的行。 以下查询将**提取入学编号在两个表中相同的学生记录**

执行查询将返回所需的结果

SQL Server CROSS JOIN

带有 ORDER BY 子句的 CROSS JOIN

ORDER BY 子句用于按指定顺序排列表的结果。 顺序可以是升序或降序。 以下查询将**按课程名称的升序显示结果**

执行查询将以课程名称的升序返回学生信息

SQL Server CROSS JOIN

带有多个表的 CROSS JOIN

交叉连接也可以与两个以上的表一起使用。 在这里,我们将通过实践学习如何连接两个以上的表。 我们已经有两个名为“**student**”和“**fee**”的表。 让我们使用以下查询创建另一个表并将其命名为“**contacts**”

我们可以使用 SELECT 语句验证表

SQL Server CROSS JOIN

让我们执行以下查询,该查询连接了三个名为 student、fee 和 contact 的表。 在此语句中,首先在 student 和 fee 之间完成 CROSS JOIN,然后它将根据 WHERE 子句中指定的条件与 contact 表连接

执行查询将返回以下输出

SQL Server CROSS JOIN

CROSS JOIN 和 INNER JOIN 之间的区别

这是关于 SQL 面试问题的重要主题。 下面解释了 SQL Server 中交叉连接和内连接之间的主要区别

INNER JOIN (内连接)CROSS JOIN (交叉连接)
此连接仅返回与指定条件匹配的表中来自的记录,并隐藏其他行和列。 如果我们没有指定任何连接,它将默认为连接。它返回来自两个表的所有可能的记录组合。 它还返回两个表的笛卡尔积。 笛卡尔积表示第一个表中存在的所有行乘以第二个表中存在的所有行。
仅当在表中找到一列匹配时才会发生此连接。此连接不需要匹配的列来连接两个表。
它组合了行,这意味着如果两个参与表有 100 条记录,则内连接仅返回 100 条记录。它不组合行,这意味着如果两个参与表有 100 条记录,则交叉连接将返回 10000 条记录。
它的性能很快,因为它消耗的资源较少。它的性能很慢,因为它消耗的资源更多。