PostgreSQL Cross Join

17 Mar 2025 | 5 分钟阅读

在本节中,我们将了解 PostgreSQL 交叉连接 的工作原理,它允许我们创建两个或多个表中行的笛卡尔积。我们还将学习如何借助 PostgreSQL 交叉连接子句 使用 表别名、WHERE 子句和连接多个表

什么是 PostgreSQL 交叉连接?

PostgreSQL 交叉连接 用于组合多个表的所有可能性,并返回包含所有选定表中每一行的输出。CROSS JOIN,进一步称为 笛卡尔连接,它允许我们生成所有相关表的笛卡尔积。

笛卡尔积可以描述为第一张表中的所有现有行乘以第二张表中的所有行。它与 内连接 并行,其中 连接条件 在此子句中不存在。

下图显示了 PostgreSQL 交叉连接, 在这里我们可以很容易地理解,交叉连接 返回 表 1 和表 2 的所有记录,并且每一行都是两张表中的行的分组。

PostgreSQL Cross Join

PostgreSQL 交叉连接语法

Cross-Join 关键字与 SELECT 命令 一起使用,并且必须写在 FROM 关键字之后。以下语法用于从两个相关表中获取所有数据

语法 1

语法 2

下面的语法与上面的语法类似,因为我们没有使用 Cross Join 关键字

Syntax3

在这里,我们可以使用 INNER JOIN 子句,其条件始终分析交叉连接的精确副本

在上面的语法中,我们有以下参数

参数描述
列列表列列表用于指定我们要返回的列或字段的名称。
表 1 和表 2这些是我们从中获取记录的表名。

PostgreSQL 交叉连接的示例

让我们看一个例子来了解 PostgreSQL 交叉连接 的工作原理

通过使用 PostgreSQL 交叉连接连接两个表

为此,我们将使用在 PostgreSQL 教程 的 PostgreSQL 完全连接部分中创建的 Summer_fruits 和 Winter_fruits 表。

表 1:Summer_fruits

要查看 Summer_fruits 表的记录,我们将使用 SELECT 命令,如下面的命令所示

输出

执行上述命令后,我们将从 Summer_fruits 表中获取数据

PostgreSQL Cross Join

表 2:Winter_fruits

要查看 Winter_fruits 表中的记录,我们将使用 SELECT 命令,如下面的命令所示

输出

执行上述命令后,我们将从 Winter_fruits 表中获取数据

PostgreSQL Cross Join

我们将执行以下命令以从两个表(Summer_fruits 和 Winter_fruits)中获取所有记录

输出

执行上述命令后,我们将获得以下输出

PostgreSQL Cross Join

当执行 CROSS-JOIN 命令时,我们将看到它显示 42 行,这意味着 Summer_fruites 表中的 行乘以 Winter_fruits 表中的 行。

注意:建议使用单独的列名来代替 SELECT * 命令,以避免重复列两次输出。

PostgreSQL 交叉连接中的不确定列问题

有时,我们需要从两个以上的表中获取选定的列记录。并且这些表可以具有一些匹配的列名。

让我们看一个 例子 来理解这种类型的情况,假设 Summer_fruits 和 Winter_fruits 表包含一个相似的列,即:fruit_id,如下面的命令所示

输出

执行上述命令后,PostgreSQL 交叉连接命令会抛出一个错误,即 列名不明确,这意味着该列的名称存在于两个表中。PostgreSQL 不清楚我们要显示哪一列。

PostgreSQL Cross Join

因此,为了解决上述错误,我们将指定列名之前的表名,如下面的命令所示

输出

执行上述命令后,我们将获得以下结果

PostgreSQL Cross Join

使用 PostgreSQL 交叉连接进行表别名

通常,我们要连接的表将具有名称相似的列,例如 fruit_id 列。

除了使用完整的表名之外,我们可以使用 表别名 为已连接的表分配短名称,以使命令更易于理解。有时,编写 完整的表名 是一个繁琐的过程。

因此,我们将使用 表别名, 并且它会返回与上面类似的结果,如下面的命令所示

输出

一旦我们实现了上述命令,我们将得到以下输出

PostgreSQL Cross Join

使用 WHERE 子句进行 PostgreSQL 交叉连接

如果我们想从表 1 (Summer_fruits) 中确定在表 2 (Winter_fruits) 中没有任何匹配行的行,我们可以将 WHERE 条件交叉连接 一起使用。

正如我们在下面的命令中看到的那样,我们正在从两个表 Summer_fruits 和 Winter_fruits 中选择行,其中 Summer_fruits_name 等于 Watermelon 并且 Winter_fruits_name 不等于 Pineapple

输出

执行上述命令后,我们将得到以下结果

PostgreSQL Cross Join

使用 PostgreSQL 交叉连接连接多个表

在上一节中,我们有两个表,例如 Summer_fruits 和 Winter_fruits,现在,如果我们想连接两个以上的表并从该特定表中获取记录。在这种情况下,我们将使用 交叉连接

例如,我们将使用 Create 子句创建 Fruite_sales 表,如下面的命令所示

要查看 Fruit_sales 表的值,我们将按如下方式使用 SELECT 子句

成功创建并将值 插入Fruit_sales 表中后,我们将借助 INSERT 命令,如下面的命令所示

创建并将值插入Fruit_sales 表中后,我们将在执行以下命令时获得以下输出

表 3:Fruit_sales

PostgreSQL Cross Join

现在,我们将借助 PostgreSQL 交叉连接 连接多个表,例如 Summer_fruits、Winter_fruits 和 Fruit_sales,如下面的语句所示

输出

执行上述命令后,我们将获得以下输出

PostgreSQL Cross Join

概述

在 PostgreSQL 交叉连接部分,我们学习了以下主题

  • 我们使用 PostgreSQL 交叉连接 子句从两个表中选择数据并了解 歧义列问题
  • 我们使用了带有 表别名和 WHERE 子句 的 PostgreSQL 完全连接条件,并从多个表中提取记录。