【问题标题】:How to delete rows using an outer join如何使用外连接删除行
【发布时间】:2013-04-16 10:08:04
【问题描述】:

我在使用 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 还是我遗漏了什么?

【问题讨论】:

  • 它不会删除任何内容,因为当link_type.id 为空时,url.link_type = link_type.id 不为真,因此这两个条件永远不会同时满足。

标签: postgresql left-join using


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    仍然不明白为什么我之前的查询不起作用(如果有人能解释一下,那就太好了),但我是这样做的:

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

    【讨论】:

    • 因为如果“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 将为您工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 2021-03-30
    相关资源
    最近更新 更多