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 - 过滤掉包含具有特定值的行的分区或行组的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery - 如何过滤具有特定条件的记录

如何过滤掉具有特定和不同值的数据框中的条目?

如何在 s-s-rS 的任何列中过滤具有空值的行

SQL 聚合具有相同 id 的行,辅助列中的特定值

需要帮助修复 Oracle SQL 查询以返回具有最大列值的行

SQL Server:仅过滤包含特定文本的行之后的行