Oracle SQL - 过滤掉包含具有特定值的行的分区或行组
Posted
技术标签:
【中文标题】Oracle SQL - 过滤掉包含具有特定值的行的分区或行组【英文标题】:Oracle SQL - filter out partitions or row groups that contain rows with specific value 【发布时间】:2013-01-13 10:58:03 【问题描述】:我正在尝试解决以下问题:数据以 X 列作为信息的外键组织在表中(它是标识此表中的一组行的 ID,该 ID 标识该表中的一组行属于一个捆绑包,拥有由另一个表中的特定实体)。因此,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”的行的每个分区?
【问题讨论】:
【参考方案1】:我更喜欢使用聚合和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 不匹配。
【讨论】:
【参考方案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。
祝你好运。
【讨论】:
【参考方案3】:这个怎么样,使用IN
?
SQLFIDDLE DEMO
select distinct colx from
demo
where colx not in (
SELECT COLX from demo
where colq = 'ABC')
;
| COLX |
--------
| 456 |
| 579 |
【讨论】:
【参考方案4】:试试这个:
select DISTINCT colx
from demo
where colq not like '%A%'
AND colq not like '%B%'
AND colx not like '%C%'
SQL Fiddle
【讨论】:
以上是关于Oracle SQL - 过滤掉包含具有特定值的行的分区或行组的主要内容,如果未能解决你的问题,请参考以下文章