我正在尝试解决以下问题:数据以表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
Run Code Online (Sandbox Code Playgroud)
该查询应返回“ 456”和“ 579”,因为X的两个不同值在列Q中没有包含值“ ABC”的行。
我正在考虑使用减号函数(选择不同的X减号(选择不同的X,其中Q =“ ABC”))来完成此操作,因为我想要的只是X的不同值。但是我想知道是否有更有效的方法这样做可以避免子查询?例如,如果我可以在X上对表进行分区,并丢弃在Q中具有“ ABC”值行的每个分区?
我更喜欢使用聚合和having子句来回答这样的问题(即关于组内的组)。这是这种情况下的解决方案:
select colx
from data d
group by colx
having max(case when colq = 'ABC' then 1 else 0 end) = 0
Run Code Online (Sandbox Code Playgroud)
如果colx有任何值ABC,则max()表达式返回1。。。不匹配0。
这应该有效:
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
Run Code Online (Sandbox Code Playgroud)
这是SQL Fiddle。
祝你好运。
| 归档时间: |
|
| 查看次数: |
2647 次 |
| 最近记录: |