PostgreSQL Self joins


PostgreSQL Self joins

在本节中,我们将了解PostgreSQL Self joins的工作,它用于关联同一个表中的行。我们还学习了如何在PostgreSQL Self join 子句的帮助下从相似表中获取分层数据

什么是 PostgreSQL 自加入?

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

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

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

注意:没有Self Join这样的关键字;但是,我们可以在别名的帮助下使用 PostgreSQL 内连接、左连接、右连接。

PostgreSQL 自连接语法

在PostgreSQL中,我们对于Self-Join有不同的语法,如下:

语法 1

在下面的语法中,我们使用内部连接关键字,它将表与自身组合:

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

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

语法2

在下面的语法中,我们使用了Left Join Keyword,它将表与自身组合在一起:

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 自连接示例

让我们看一个例子来理解PostgreSQL Self join是如何工作的:

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

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

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

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

  • 我们将在本地系统中打开 pgAdmin,然后在对象树中打开,我们将右键单击Databases并选择Create然后选择database

数据库 → 创建 → 数据库

PostgreSQL 自加入

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

PostgreSQL 自加入

  • 组织数据库已成功并显示在创建对象树,因为我们可以在下面的截图中看到:

PostgreSQL 自加入

成功创建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;

输出

PostgreSQL 自加入

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

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

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

PostgreSQL 自加入

在下面的示例中,我们将在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;

输出

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

PostgreSQL 自加入

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

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

并且连接谓词Customer_id 和 Orders_id列中类似值的帮助下识别Customer/Orders对。

注意:Order_id 为 Null 的客户 (Mia Rodriguez) 不会出现在结果中。

我们将使用 LEFT JOIN 代替 INNER JOIN 子句,使用以下命令将顶部Order 包含在输出表中:

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;

输出

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

PostgreSQL 自加入

概述

在 PostgreSQL 自联接部分,我们学习了以下主题:

  • PostgreSQL的自联接是一种特殊的加入,在这里我们也可以得到分层数据在同一个表内。
  • 我们使用PostgreSQL Self join子句在Inner Join 和 Left Join 子句的帮助下组合表本身。