11

我在从 PostgreSQL 表中删除记录时遇到问题,使用LEFT JOIN.

我想删除通过以下查询获得的行:

SELECT * FROM url 
LEFT JOIN link_type ON url.link_type = link_type.id 
WHERE link_type.id IS NULL

为此,这就是我所做的:

 DELETE FROM url
 USING link_type
 WHERE url.link_type = link_type.id  AND link_type.id IS NULL

查询有效,但不会删除任何内容,尽管这正是文档中解释的内容:http ://www.postgresql.org/docs/current/static/sql-delete.html 。

我的问题是由于IS NULL查询还是我遗漏了什么?

4

2 回答 2

12

干得好,太阳。次要建议:使用 EXISTS/NOT EXISTS 时,您不需要SELECT *. 一个常见的约定(docs)是这样写SELECT 1的:

DELETE FROM url WHERE NOT EXISTS (
  SELECT 1 FROM link_type WHERE url.link_type = link_type.id 
);

从功能上讲,这两种方式都有效。

于 2013-04-16T15:28:44.073 回答
6

仍然不明白为什么我以前的查询不起作用(如果有人可以解释,那就太好了),但这是我的诀窍:

DELETE FROM url WHERE NOT EXISTS (SELECT * FROM link_type WHERE url.link_type = link_type.id );
于 2013-04-16T10:34:30.480 回答