PostgreSQL 教程: DELETE JOIN 连接删除

九月 6, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的DELETE语句来模拟连接删除操作。

带有 USING 子句的 DELETE 语句简介

PostgreSQL 不支持DELETE JOIN语句。但是,它确实支持DELETE语句中的USING子句,该子句提供与DELETE JOIN类似的功能。

下面显示了带有USING子句的DELETE语句的语法:

DELETE FROM table_name1
USING table_expression
WHERE condition
RETURNING returning_columns;

在这个语法中:

  • 首先,在USING关键字后指定表表达式。它可以是一张或多张表。
  • 然后,在WHERE子句中使用USING子句中出现的表中的列来连接数据。

例如,以下语句使用带有USING子句的DELETE语句,从t1删除与t2相同 ID 的数据:

DELETE FROM t1
USING t2
WHERE t1.id = t2.id

让我们看一个例子。

首先,使用以下语句创建两个表contactsblacklist

DROP TABLE IF EXISTS contacts;
CREATE TABLE contacts(
   contact_id serial PRIMARY KEY,
   first_name varchar(50) NOT NULL,
   last_name varchar(50) NOT NULL,
   phone varchar(15) NOT NULL
);

DROP TABLE IF EXISTS blacklist;
CREATE TABLE blacklist(
    phone varchar(15) PRIMARY KEY
);

INSERT INTO contacts(first_name, last_name, phone)
VALUES ('John','Doe','(408)-523-9874'),
       ('Jane','Doe','(408)-511-9876'),
       ('Lily','Bush','(408)-124-9221');

INSERT INTO blacklist(phone)
VALUES ('(408)-523-9874'),
       ('(408)-511-9876');

其次,从contacts表删除在blacklist表中存在电话号码的联系人:

DELETE FROM contacts 
USING blacklist
WHERE contacts.phone = blacklist.phone;

输出:

DELETE 2

第三步,从contacts表中查询数据:

SELECT * FROM contacts;

使用子查询进行连接删除

USING子句不是 SQL 标准的一部分。这意味着USING子句可能在其他数据库系统中不可用。

如果您计划使您的应用程序与其他数据库产品兼容,则不应在DELETE语句中使用USING子句。相反,您可以使用子查询

以下语句使用DELETE语句,删除电话号码出现在blacklist表中的所有联系人:

DELETE FROM contacts
WHERE phone IN (SELECT phone FROM blacklist);

在此示例中,子查询返回blacklist表中的电话列表,DELETE语句删除电话与子查询返回的电话匹配的联系人。

概括

  • DELETE语句或子查询中使用USING子句来模拟DELETE JOIN操作。