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

sny*_*sny 1 sql oracle oracle11g

在表T中,我试图删除具有相同A值的组中的所有记录,但仅当该组的所有成员都将B设置为"x"时.

鉴于表T:

+-------+--------+
|   A   |   B    |
+-------+--------+
|    2  |   ''   |
|    2  |   'x'  |
|    2  |   ''   |
|    8  |   'x'  |
|    8  |   'x'  |
|   15  |   ''   |
|   15  |   ''   |
+-------+--------+
Run Code Online (Sandbox Code Playgroud)

必须删除A == 8的两个记录,因为它们中的所有两个都具有B == 1.A == 2的组具有B的混合值,因此它保持不变.并且A == 15的组没有全部B等于1它也保持不变.

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

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

Iły*_*sov 5

你可以试试这个查询:

delete from T
where A in (
select A
from T
group by A
having sum(B) = count(*)
)
Run Code Online (Sandbox Code Playgroud)

如果列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'