因此,我需要一个在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.
我认为这意味着我的查询效率极低(或者完全是错误的)。我想有一种简单的方法可以做到这一点,但我还没有找到。有什么想法吗?
答案 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;