【发布时间】:2020-10-15 14:13:19
【问题描述】:
假设我有一个如下所示的 oracle 表:
因此,一个样本可以有 2 行,其中一行位于 test_value == value1 处,另一行位于 test_value == value2 处,或者其中一行可能缺失。
如果我想查询具有value1 行但不是value2 行的所有样本(即所有缺少value2 行的样本),我该怎么做?
(即,在我的示例中,我希望找到 sample2。)
【问题讨论】:
假设我有一个如下所示的 oracle 表:
因此,一个样本可以有 2 行,其中一行位于 test_value == value1 处,另一行位于 test_value == value2 处,或者其中一行可能缺失。
如果我想查询具有value1 行但不是value2 行的所有样本(即所有缺少value2 行的样本),我该怎么做?
(即,在我的示例中,我希望找到 sample2。)
【问题讨论】:
使用not exists:
select *
from t
where t.test_value = 'value1' and
not exists(select 1 form t t2 where t2.sample = t.sample and t2.test_value = 'value2');
如果你只想要 samples 而不是完整的行,那么也可以使用聚合:
select sample
from t
where test_value in ('value_1', 'value_2')
group by sample
having min(test_value) = max(test_value) and
max(test_value) = 'value1';
实际上,对于您的特定字符串,可以简化为:
having max(test_value) = 'value1'
【讨论】:
having 变体向我抛出了错误(ORA-00937:不是单组函数),但 not exists 解决方案完美运行,谢谢!
having 查询中的 where 子句起什么作用?有理由不简单地省略它吗?
试试这个,它检测样本只有1个值的情况,然后检查这个值是value1。
SELECT SAMPLE
FROM
(
SELECT SAMPLE, SUM(CASE WHEN TEST_VALUE = 'value1' THEN 1 ELSE 0 END) AS IS_TEST_VALUE1
FROM tbl
GROUP BY SAMPLE
HAVING COUNT(*) = 1
) AS X
WHERE IS_TEST_VALUE1 = 1
【讨论】: