在表T中,我试图删除具有相同A值的组中的所有记录,但前提是该组中的所有成员都将B设置为“x”。
鉴于表T:
+-------+--------+
| A | B |
+-------+--------+
| 2 | '' |
| 2 | 'x' |
| 2 | '' |
| 8 | 'x' |
| 8 | 'x' |
| 15 | '' |
| 15 | '' |
+-------+--------+
必须删除A == 8的两个记录,因为它们中的所有两个都具有B == 1。 A == 2的组具有B的混合值,因此它保持不变。并且A == 15的组没有全部B等于1它也保持不变。
这可以通过一个查询来完成吗?
如果没有,那么对于有大量记录的表来说,任何其他方式都足够快了吗?
答案 0 :(得分:5)
您可以尝试此查询:
delete from T
where A in (
select A
from T
group by A
having sum(B) = count(*)
)
如果列b可以包含非0/1值,则可以添加其他条件:
having sum(B) = count(*) and min(b)=1 and max(b)=1
如果你不能使用数值,你可以使用min / max,比如
having min(b)='x' and max(b)='x'
答案 1 :(得分:2)
试试这个。带有一些聚合的Group by and Having
应该可以正常工作
DELETE FROM tablename
WHERE a IN(SELECT a
FROM tablename
GROUP BY a
HAVING count(case when b='x' then 1 end) = Count(b)