我有一个名为items的表,其中包含“itemID”和“parentID”,其中parentID是表中另一行的ID。我想删除不再存在parentID-row的行。
这就是我提出的:
DELETE FROM items
WHERE (SELECT COUNT(1)
FROM items as parent
WHERE items.parentID=parent.itemID)=0
但是我收到以下错误:您无法在FROM子句
中为更新指定目标表'items'编辑:如果查询也会删除链接到此查询删除的项目的项目,这样可以在sql中进行,还是应该对其进行编码?
答案 0 :(得分:7)
使用子查询是无效的;使用multiple-table syntax的左连接:
DELETE items
FROM items
left join items as parent
on items.parentID = parent.itemID
WHERE parent.itemID is NULL
多表语法允许您在删除命令中指定连接 - 因此您可以连接多个表并仅从一个表中删除。即DELETE t1 FROM t1 join t2 ....
将加入t1
和t2
,但只会删除表t1
中的相应行。
至于你的问题“如果查询删除链接到此查询删除的项目的项目会很好,这在sql中是否可行,或者我应该编码吗?”
我认为最终会出现级联 - 删除的记录可能是另一条记录的父级,所以也删除那条记录,但是那条记录也可能是另一条记录的父级,所以你也需要删除它等等。我认为不可能通过单个SQL查询来查询所有这个级联。
所以我认为最简单的解决方案是重新运行上述查询,直到没有删除任何行。
答案 1 :(得分:3)
查询将是
DELETE items FROM items
left join parent
on items.parentID = parent.ID
WHERE parent.ID is NULL
答案 2 :(得分:0)
delete from FooTable f1 where f1.parent_id
not in (select f2.item_id from FooTable f2);
当然这个查询有一个小问题,如果你很敏锐,你可能已经注意到,它可能会生成没有父级的新FooRecords(这样,它们的父级可能会在查询执行期间被删除)。
如果您不需要自动化的东西,请手动执行多次查询,或将其置于循环内,并在删除的记录数为0时停止循环。