如何使用外部联接删除行

SuN*_*SuN 11 postgresql using left-join

我有一个问题是从PostgreSQL表中删除记录,使用LEFT JOIN.

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

SELECT * FROM url 
LEFT JOIN link_type ON url.link_type = link_type.id 
WHERE link_type.id IS NULL
Run Code Online (Sandbox Code Playgroud)

为此,我做了以下事情:

 DELETE FROM url
 USING link_type
 WHERE url.link_type = link_type.id  AND link_type.id IS NULL
Run Code Online (Sandbox Code Playgroud)

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

我的问题是由于IS NULL在查询中还是我错过了什么?

mar*_*rcj 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 
);
Run Code Online (Sandbox Code Playgroud)

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


SuN*_*SuN 6

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

DELETE FROM url WHERE NOT EXISTS (SELECT * FROM link_type WHERE url.link_type = link_type.id );
Run Code Online (Sandbox Code Playgroud)

  • 因为如果"url.link_type = link_type.id"为"TRUE",则"link_type.id"_不是"NULL"_,如果"link_type.id"为"NULL",则第一个条件为"url.link_type = link_type.id"将返回"NULL"然后你得到"NULL AND TRUE"只是"NULL".由于NULL是未知值,因此您无法将其设置为TRUE或FALSE,因此不会显示任何行.NOT EXISTS将为您工作. (2认同)