我在MySQL表中有以下数据名为info:
chapter | section
3 | 0
3 | 1
3 | 2
3 | 3
4 | 0
5 | 0
我想为chapter = n删除一行,但仅当相同章节没有部分> 0时才会删除。因此,第4章和第5章不能删除第3章。我知道以下内容不起作用:
DELETE info WHERE chapter = 3 AND NOT EXISTS (SELECT * FROM info WHERE chapter = 3 AND section>0)
;
同一个表在语句中使用了两次。那么实现目标的最简单方法是什么?
答案 0 :(得分:3)
你的想法是正确的。这是语法:
DELETE
FROM mytable
WHERE chapter NOT IN (
SELECT * FROM (
select tt.chapter
from mytable tt
where tt.section <> 0
group by tt.chapter
) tmp
)
嵌套选择是解决MySQL中的一个错误。
答案 1 :(得分:1)
您可以运行子查询以返回包含多个部分的行,然后删除从子查询返回的行。
DELETE FROM table1 WHERE table1.chapter Not IN (select chapter from
(SELECT table1.chapter FROM table1 WHERE Table1.section >=1 ) Results);
Example Fiddle based on your question
如果您只想删除特定的章节,也可以在子查询where子句中提供章节。如果它不符合where子句,则不会删除任何记录。
答案 2 :(得分:0)
这应该这样做。
DELETE FROM Table t
WHERE NOT EXISTS(
SELECT 1
FROM Table t2
Where t2.chapter = t.chapter
And t2.section > 0
)
根据我的经验,Exists
通常比In
表现更好。如果要存储大量记录,则应考虑到这一点。