PostgreSQL Self Join自连接

在本节中,我们将了解PostgreSQL 自连接的工作原理,它用于关联同一表中的行。我们还学习了如何借助PostgreSQL Self join 子句从相似表中获取层次结构数据。

什么是 PostgreSQL Self Join自连接?

PostgreSQL中,我们有一种特殊类型的连接,称为Self Join。《PostgreSQL Self Join》用于完全设置相似表的不同名称,我们也可以使用别名。

为了进行自连接,我们将使用不同的表别名两次定义一个相似的表,并在ON关键字之后给出连接谓词。

在实时情况下,我们使用自连接来比较同一个表中的行(因为 PostgreSQL 中不允许比较相似的表名),并获取分层数据。

PostgreSQL Self Join自连接语法

在PostgreSQL中,我们对Self-Join有不同的语法,分别是:

语法1

在下面的语法中,我们使用了一个内部连接关键字,它将表格自身结合起来:

SELECT column_list  
FROM table_name Table1  
INNER JOIN table_name Table2 ON join_predicate;  

在上面的语法中,table_name是在PostgreSQL INNER JOIN 子句的帮助下结合起来的。

SELECT column_list  
FROM table_name Table1  
LEFT JOIN table_name Table2 ON join_predicate;  

在上面的语法中,table_name在PostgreSQL LEFT JOIN 子句的帮助下自行组合。

语法3

在下面的语法中,我们使用Right Join Keyword,它将表格自身结合起来:

SELECT column_list  
FROM table_name Table1  
RIGHT JOIN Table_name Table2 ON join_predicate;  

在上面的语法中,table_name在 PostgreSQL RIGHT JOIN 子句的帮助下自行组合。

PostgreSQL Self Join自连接示例

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

从表中获取分层记录的示例

为此,我们将创建一个示例数据库,然后在 CREATE 命令的帮助下创建一个名为 Customer 的表,并使用 INSERT 命令插入一些值。

首先,我们将创建一个示例数据库,就像我们在 PostgreSQL 教程的前一节中创建的一样,或者参考以下链接以了解我们如何在 PostgreSQL 中创建数据库:

现在,我们将按照以下过程,在 pgadmin4 中创建一个数据库:

  • 我们将在本地系统中打开 pgAdmin,然后在对象树中打开,我们将右键单击数据库并选择创建,然后选择数据库。

数据库 → 创建 → 数据库

  • 之后,创建数据库窗口将打开,我们需要在其中提供一些必要的详细信息(数据库名称、注释)以创建数据库,然后单击“保存”按钮。

  • 组织数据库已成功创建并显示在对象树中,如下面的屏幕截图所示:

成功创建Origination 数据库后,我们将使用 CREATE 命令创建Customer表,如下面的语句所示:

CREATE TABLE Customer (  
Customer_id INT PRIMARY KEY,  
First_name VARCHAR NOT NULL,  
Last_name VARCHAR NOT NULL,  
Order_id INT,  
FOREIGN KEY (Order_id) REFERENCES Customer (Customer_id)   
ON DELETE CASCADE  
); 

 现在,我们将在 INSERT 的帮助下将一些客户记录插入到Customer表中,如下面的语句所示:

INSERT INTO Customer(Customer_id,First_name, Last_name,  
Order_id )VALUES  
(1, 'Mia', 'Rodriguez', NULL),  
(2, 'Maria', 'Garcia', 1),  
(3, 'James ', 'Johnson', 1),  
(4, 'Michael', 'Smith', 2),    
(5, 'David', 'Smith', 2),   
(6, 'Jones', 'Smith', 2),  
(7, 'Margaret', 'Brown', 3),  
(8, 'Jane', 'Miller', 3),  
(9, 'Catherine', 'Martinez', 4),  
(10, 'Ana', 'Clark', 4);  

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

Select * from Customer;  

在Customer表中,Order_id列引用Customer_id列。Order_id列中的值显示客户购买的订单。

如果Order_id列中的值为Null,则客户不会购买任何东西。

正如我们在下图中看到的,整体层次结构如下所示:

在下面的示例中,我们将在Customer表中借助 Self Join 获取购买者的数据:

SELECT  
c.First_name || ' ' || o.Last_name Customer,  
o.first_name || ' ' || o.last_name Orders  
FROM  
Customer c  
INNER JOIN Customer o ON o. order_id = c.order_id  
ORDER BY Orders;  

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

正如我们在上面的输出表中所观察到的,Customer表被执行了两次,一次作为Customer,另一次作为Orders。

在上面的命令中,我们使用表别名,例如c代表customer和o代表Orders。

连接谓词借助Customer_id 和 Orders_id列中的相似值来识别Customer/Orders对。

正如我们在上面的输出表中所观察到的,Customer表被执行了两次,一次作为Customer,另一次作为Orders。

在上面的命令中,我们使用表别名,例如c代表customer和o代表Orders。

连接谓词借助Customer_id 和 Orders_id列中的相似值来识别Customer/Orders对。

我们将使用 LEFT JOIN 代替 INNER JOIN 子句,使用以下命令在输出表中包含最高顺序:

SELECT  
c.First_name || ' ' || o.Last_name Customer,  
o.first_name || ' ' || o.last_name Orders  
FROM  
Customer c  
LEFT JOIN Customer o ON o. order_id = c.order_id  
ORDER BY Orders;  

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

热门文章

优秀文章