删除其他表中未引用的行

Has*_*aig 23 postgresql join delete postgresql-9.3

我在 PostgreSQL 9.3 数据库中有两个表: Tablelink_reply有一个which_group指向 table的外键link_group

我想删除link_grouplink_reply存在相关行的所有行。听起来很基本,但我一直在努力。

会不会像这样简单(不工作)?

DELETE FROM link_group WHERE link_reply = NULL;
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 27

引用手册:

使用数据库中其他表中包含的信息删除表中的行有两种方法:使用子选择,或在USING子句中指定附加表。哪种技术更合适取​​决于具体情况。

大胆强调我的。使用包含在另一个表中的信息有点棘手,但有简单的解决方案。从标准技术库到...

...NOT EXISTS反半连接可能是最简单和最有效的DELETE

DELETE FROM link_group lg
WHERE  NOT EXISTS (
   SELECT FROM link_reply lr
   WHERE  lr.which_group = lg.link_group_id
   );
Run Code Online (Sandbox Code Playgroud)

假设(因为没有提供表定义)link_group_id作为link_group.

@Mihai 评论的技术也有效(正确应用):

DELETE FROM link_group lg
USING  link_group      lg1
LEFT   JOIN link_reply lr ON lr.which_group = lg1.link_group_id
WHERE  lg1.link_group_id = lg.link_group_id
AND    lr.which_group IS NULL;
Run Code Online (Sandbox Code Playgroud)

但是由于USING子句中的表表达式lg使用 a连接到目标表(在示例中)CROSS JOIN,因此您需要同一个表的另一个实例作为 的垫脚石(lg1在示例中)LEFT JOIN,这不太优雅,通常更慢。