【问题标题】:SQL query for entries not spanning multiple rows不跨越多行的条目的 SQL 查询
【发布时间】:2020-10-15 14:13:19
【问题描述】:

假设我有一个如下所示的 oracle 表:

因此,一个样本可以有 2 行,其中一行位于 test_value == value1 处,另一行位于 test_value == value2 处,或者其中一行可能缺失。

如果我想查询具有value1 行但不是value2 行的所有样本(即所有缺少value2 行的样本),我该怎么做?

(即,在我的示例中,我希望找到 sample2。)

【问题讨论】:

    标签: sql oracle select


    【解决方案1】:

    使用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 子句起什么作用?有理由不简单地省略它吗?
    • @CodingCat 。 . .如果只有这两个值,则不需要。然而,这个问题留下了存在更多价值的可能性。
    【解决方案2】:

    试试这个,它检测样本只有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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2018-10-17
      • 1970-01-01
      相关资源
      最近更新 更多