九月 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
让我们看一个例子。
首先,使用以下语句创建两个表:contacts和blacklist:
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操作。