如何使用外部联接删除行

时间:2013-04-16 10:08:04

标签: postgresql left-join using

我在使用LEFT JOIN删除PostgreSQL表中的记录时遇到了问题。

我想用以下查询删除我得到的行:

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还是错过了某些内容?

2 个答案:

答案 0 :(得分:11)

干得好,太阳。次要建议:使用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 
);

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

答案 1 :(得分:6)

仍然不明白为什么我以前的查询不起作用(如果有人可以解释,会很好),但这是我如何做的伎俩:

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