oracle查询以检查具有相同ID和给定字段的行是否都相同

时间:2018-10-12 19:51:18

标签: sql oracle

因此,我需要一个在Oracle中运行的查询,该查询将为我提供行的所有ID,其中给定字段在具有该ID的每一行上都具有相同的值,并且没有该ID的行具有不匹配项该给定字段中的值。

因此,如果我有一个这样的表,并且正在FieldB中寻找值X:

ID     FieldA     FieldB     FieldC
1      A          X          D
2      B          X          E
2      C          Y          F
1      D          X          G
3      E          X          H
3      F          Z          I
1      G          X          J
1      H          X          K
1      I          X          L

我想要只给我ID 1的东西,因为该ID的每一行在FieldB中都有X,并且没有ID 1的行在FieldB中没有X。我尝试了以下查询:

SELECT 
        a.ID
    from 
        tablename a
    where
        exists (select 1 from tablename where ID = a.ID and FieldB = 'X')
        and not exists (select 1 from tablename where ID = a.ID and (FieldB != 'X' or FieldB is null))

但我不断收到错误消息:

ORA-01652: unable to extend temp segment by 128 in tablespace TEMP_TS2
01652. 00000 -  "unable to extend temp segment by %s in tablespace %s"
*Cause:    Failed to allocate an extent of the required number of blocks for
           a temporary segment in the tablespace indicated.

我认为这意味着我的查询效率极低(或者完全是错误的)。我想有一种简单的方法可以做到这一点,但我还没有找到。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可以使用聚合和having

select id
from t
group by id
having min(fieldB) = max(fieldB) and -- all the same
       min(fieldB) = 'X';

答案 1 :(得分:0)

可能更容易理解,请使用hading子句,但只要找到其中列的唯一计数仅等于1的那些子即可。

select a.ID
from tablename a
where a.FieldB = 'X'
group by a.ID
having count(distinct FieldB) = 1;