5

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

IE

数据如下所示:

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

4 回答 4

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 不匹配。

于 2013-01-29T19:53:59.960 回答
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

这是SQL Fiddle

祝你好运。

于 2013-01-29T19:07:29.507 回答
2

这个怎么样,使用IN

SQLFIDDLE 演示

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

| COLX |
--------
|  456 |
|  579 |
于 2013-01-29T19:09:03.083 回答
0

试试这个:

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

SQL小提琴

于 2013-01-29T19:10:24.790 回答