PostgreSQL 交叉连接


PostgreSQL 交叉连接

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

什么是 PostgreSQL 交叉连接?

PostgreSQL的交叉联接用于将多个表和返回输出,该输出包含从所有选定的表的每一行的所有的可能性进行组合。在CROSS JOIN,进一步称为CARTESIAN JOIN,使我们能够生产所有相关的表的笛卡尔乘积。

Cartesian product 可以被描述为在第一表乘以在所述第二表中的所有行的所有现有行。它与Inner Join**并行,其中此子句不存在连接条件。

下面的维恩图展示了PostgreSQL Cross Join,在这里我们可以很容易理解,Cross Join返回了Table1 和 Table2 中的所有记录,每一行都是来自两个表的行的分组。

PostgreSQL 交叉连接

PostgreSQL 交叉连接语法

跨加入关键字用于与SELECT命令,必须后写FROM关键字。以下语法用于从两个关联表中获取所有数据:

语法 1

SELECT column-lists    
FROM Table1    
CROSS JOIN Table2;

语法2

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

SELECT [column_list|*]  
FROM Table1, Table2;

语法 3

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

SELECT *  
FROM Table1  
INNER JOIN Table2 ON true;

在上述语法中,我们有以下参数:

范围 描述
Column-lists column-list 用于指定我们要返回的列或字段的名称。
Table1 and Table2 这些是我们从中获取记录的表名。

PostgreSQL 交叉连接示例

让我们看一个例子来理解PostgreSQL 交叉连接是如何工作的:

使用 PostgreSQL Cross Join 连接两个表

为此,我们将使用Summer_fruits 和 Winter_fruits\表,这是我们在PostgreSQL 教程的 PostgreSQL Full join 部分中创建的。

表 1: Summer_fruits

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

Select * from Summer_fruits;

输出

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

PostgreSQL 交叉连接

表 2:Winter_fruits

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

Select * from Winter_fruits;

输出

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

PostgreSQL 交叉连接

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

SELECT *  
FROM Summer_fruits   
CROSS JOIN Winter_fruits ;

输出

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

PostgreSQL 交叉连接

交叉联接执行命令,我们将看到它显示42行,这意味着从行Summer_fruites\表乘上从行Winter_fruits\表。

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

PostgreSQL CROSS JOIN中的不确定列问题

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

让我们看一个例子来理解这种情况,假设Summer_fruits 和 Winter_fruits\表包含一个类似的列:fruit_id,我们可以在以下命令中看到:

SELECT fruit_id, SF_ID, Summer_fruits_name, WF_ID, Winter_fruits_name  
FROM Summer_fruits   
CROSS JOIN Winter_fruits;

输出

在执行上述命令时,PostgreSQL CROSS JOIN 命令抛出一个错误,即The column name is ambiguous,这意味着该列的名称存在于两个表中。PostgreSQL 变得不清楚我们要显示哪一列。

PostgreSQL 交叉连接

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

SELECT Summer_fruits.fruit_id, Summer_fruits.SF_ID, Summer_fruits.Summer_fruits_name,   
Winter_fruits.WF_ID, Winter_fruits.Winter_fruits_name  
FROM Summer_fruits   
CROSS JOIN Winter_fruits ;

输出

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

PostgreSQL 交叉连接

使用 PostgreSQL 交叉连接的表别名

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

我们可以使用表别名来指定连接表的短名称,而不是使用完整的表名,以使命令更易于理解。有时,编写完整的表名是一个乏味的过程。

因此,我们将使用表别名,它返回与上面类似的结果,我们可以在下面的命令中看到:

SELECT s.fruit_id, s.SF_ID, s.Summer_fruits_name, w.WF_ID,  
w.Winter_fruits_name  
FROM Summer_fruits s  
CROSS JOIN Winter_fruits w;

输出

一旦我们执行了上面的命令,我们将得到以下输出:

PostgreSQL 交叉连接

使用 WHERE 子句的 PostgreSQL 交叉连接

如果我们想识别 Table1 ( Summer_fruits ) 中在 Table2 ( Winter_fruits ) 中没有任何匹配行的行,我们可以将WHERE 条件与Cross Join 结合使用

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

SELECT Summer_fruits.fruit_id, Summer_fruits.SF_ID,   
Summer_fruits.Summer_fruits_name, Winter_fruits.WF_ID,  
Winter_fruits.Winter_fruits_name  
FROM Summer_fruits   
CROSS JOIN Winter_fruits    
WHERE Summer_fruits_name ='Watermelon'   
AND Winter_fruits_name != 'Pineapple';

输出

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

PostgreSQL 交叉连接

使用 PostgreSQL Cross JOIN 连接多个表

在上面的部分中,我们现在有两个表作为Summer_fruits 和 Winter_fruits\,如果我们想连接两个以上的表并从该特定表中获取记录。在这种情况下,我们将使用Cross join

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

CREATE TABLE Fruit_sales (  
Fruit_id int primary key,   
Sales_id int,  
Fruits_name varchar not null  
);

要查看Fruit_sales表的值,我们将使用SELECT子句,如下所示:

一旦Fruit_sales\表已经创建成功,我们将插入一些值与INSERT命令的帮助,因为我们可以在下面的命令来查看:

INSERT INTO Fruit_sales (fruit_id, Sales_id, Fruits_name)  
VALUES (1, 101,'Apple'),  
(2, 102,'Banana'),  
(3, 103,'Watermelon'),  
(4, 104,'Mango'),  
(5, 105,'Pineapple'),  
(6, 105,'Grapes');

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

Select * from Fruit_sales;

表 3: Fruit_sales

PostgreSQL 交叉连接

现在,我们将在PostgreSQL Cross Join的帮助下加入***Summer_fruits、Winter_fruits 和 Fruit_sales***等多个表,如下面的语句所示:

SELECT * FROM Summer_fruits    
LEFT JOIN (Winter_fruits CROSS JOIN Fruit_sales)    
ON Summer_fruits.fruit_id= Fruit_sales.fruit_id    
ORDER BY Fruits_name;

输出

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

PostgreSQL 交叉连接

概述

在 PostgreSQL Cross Join 部分,我们学习了以下主题:

  • 我们使用PostgreSQL Cross join子句从两个表中选择数据并理解Ambiguous Columns 问题
  • 我们使用带有表别名和 WHERE 子句的 PostgreSQL 完整连接条件,并从多个表中获取记录。