Oracle SQL-筛选出包含具有特定值的行的分区或行组

uba*_*jea 5 sql oracle filter

我正在尝试解决以下问题:数据以表X的形式作为信息的外键组织在表中(它是ID,用于标识此表中的一组行归为一束,由特定的束缚实体在另一个表中)。因此,X的每个不同值在此都具有与其关联的多个行。我想过滤掉X的所有不同值,这些X的相关行包含Q列中的值“ ABC”。

数据如下所示:

Column X   Column Q
--------   ---------
123        ABC
123        AAA    
123        ANQ
456        ANQ
456        PKR
579        AAA
579        XYZ
886        ABC
Run Code Online (Sandbox Code Playgroud)

该查询应返回“ 456”和“ 579”,因为X的两个不同值在列Q中没有包含值“ ABC”的行。

我正在考虑使用减号函数(选择不同的X减号(选择不同的X,其中Q =“ ABC”))来完成此操作,因为我想要的只是X的不同值。但是我想知道是否有更有效的方法这样做可以避免子查询?例如,如果我可以在X上对表进行分区,并丢弃在Q中具有“ ABC”值行的每个分区?

Gor*_*off 5

我更喜欢使用聚合和having子句来回答这样的问题(即关于组内的组)。这是这种情况下的解决方案:

select colx
from data d
group by colx
having max(case when colq = 'ABC' then 1 else 0 end) = 0
Run Code Online (Sandbox Code Playgroud)

如果colx有任何值ABC,则max()表达式返回1。。。不匹配0。


sge*_*des 3

这应该有效:

SELECT DISTINCT t.ColX
FROM mytable t
  LEFT JOIN mytable t2 on t.colx = t2.colx and t2.colq = 'ABC'
WHERE t2.colx IS NULL
Run Code Online (Sandbox Code Playgroud)

这是SQL Fiddle

祝你好运。