SQL Server CROSS JOIN17 Mar 2025 | 5 分钟阅读 CROSS JOIN 通过组合两个或多个表的所有可能性来生成结果,其中包含所有贡献表中的每一行。 换句话说,它通过生成参与连接操作的所有表的每一行的配对组合来返回结果。 这种连接有时也被称为 **CARTESIAN JOIN**,它提供所有关联表的笛卡尔积。 **笛卡尔积**可以解释为存在于第一个表中的所有行乘以存在于第二个表中的所有行。 它类似于 INNER JOIN,此子句不提供连接条件。 我们可以通过以下视觉表示来理解它,其中 CROSS JOIN 返回 **table1** 和 **table2** 中的所有记录,并且第一个表的每一行与第二个表的每一行组合。 ![]() 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**”的表,其中包含费用明细。 这是表输出 ![]() 如果我们想从这两个表中获取所有记录,我们使用以下语句 执行上述记录后,我们将获得以下输出 ![]() 当我们执行上述语句时,我们将观察到它显示了 40 行。 这意味着来自学生表的八行乘以来自费用表的五行。 在上面的输出图像中,我们注意到该表包含多个重复的列。 如果您想避免这种重复,建议使用单独的列名而不是 SELECT * 语句。 CROSS JOIN 中的歧义列问题假设我们只想从所有参与表和这些表包含一些相同列名的表中检索选定的列。 在这种情况下,SQL Server **会抛出错误:列名模棱两可**。 这表示该列的名称出现在两个表中,并且 SQL Server 不确定您要检索哪一列。 以下示例可以帮助您更好地理解它 执行此语句将产生以下错误消息 ![]() 但是,我们可以通过在列名之前指定表名来解决此问题。 因此,我们可以如下重写上述查询以删除此错误 执行查询将返回以下输出 ![]() 带有 WHERE 子句的 CROSS JOIN我们使用 WHERE 子句从表中检索过滤后的行。 以下查询将**提取入学编号在两个表中相同的学生记录** 执行查询将返回所需的结果 ![]() 带有 ORDER BY 子句的 CROSS JOINORDER BY 子句用于按指定顺序排列表的结果。 顺序可以是升序或降序。 以下查询将**按课程名称的升序显示结果** 执行查询将以课程名称的升序返回学生信息 ![]() 带有多个表的 CROSS JOIN交叉连接也可以与两个以上的表一起使用。 在这里,我们将通过实践学习如何连接两个以上的表。 我们已经有两个名为“**student**”和“**fee**”的表。 让我们使用以下查询创建另一个表并将其命名为“**contacts**” 我们可以使用 SELECT 语句验证表 ![]() 让我们执行以下查询,该查询连接了三个名为 student、fee 和 contact 的表。 在此语句中,首先在 student 和 fee 之间完成 CROSS JOIN,然后它将根据 WHERE 子句中指定的条件与 contact 表连接 执行查询将返回以下输出 ![]() CROSS JOIN 和 INNER JOIN 之间的区别这是关于 SQL 面试问题的重要主题。 下面解释了 SQL Server 中交叉连接和内连接之间的主要区别
下一篇主题SQL SERVER 更新连接 |
我们请求您订阅我们的新闻通讯以获取最新更新。