我正在尝试解决以下问题:数据在表中进行组织,其中列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”的行的每个分区?
答案 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
?
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%'