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

时间:2013-01-29 19:00:17

标签: 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

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

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

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

这应该有效:

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

这是SQL Fiddle

祝你好运。

答案 2 :(得分:2)

如何使用IN

SQLFIDDLE DEMO

select distinct colx from 
demo
where colx not in (
  SELECT COLX from demo
where colq = 'ABC')
;

| COLX |
--------
|  456 |
|  579 |

答案 3 :(得分:0)

试试这个:

select DISTINCT colx 
  from demo 
 where colq not like '%A%' 
   AND colq not like '%B%' 
   AND colx not like '%C%'

SQL Fiddle