SQL DELETE基于相反组的记录组为空

时间:2014-12-30 19:25:12

标签: sql oracle oracle11g

在表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它也保持不变。

这可以通过一个查询来完成吗?

如果没有,那么对于有大量记录的表来说,任何其他方式都足够快了吗?

2 个答案:

答案 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)