【问题标题】:Oracle SQL: How to write below SQL in OracleOracle SQL:如何在 Oracle 中编写以下 SQL
【发布时间】:2019-05-18 16:18:06
【问题描述】:

有一个表t1:

id type 
1    a
1    b
2    c
2    a
3    a
3    a
4    a

现在我需要检查id是否只有a类型并且计数是1(单个),即上面的数据中只有id 4满足这个条件

SELECT type, COUNT (1)
FROM t1
where id = :id
GROUP BY type
HAVING COUNT (1) = 1;

我使用上面的 SQL 查询来获取数据,然后在代码中使用它。这不是一个好的解决方案,谁能帮我用一个 SQL 查询得到正确的结果?

【问题讨论】:

    标签: sql oracle select group-by count


    【解决方案1】:

    我会按 ID 分组并过滤两个方面:

    1. 总数为 1
    2. 非 a 类型的行数(使用 case 语句)为 0


    SELECT   id
    FROM     t1
    GROUP BY id
    HAVING   COUNT(*) = 1 AND COUNT(CASE WHEN type <> 'a' THEN 1 END) = 0
    

    【讨论】:

      【解决方案2】:

      您需要一个带有HAVING BY 子句的简单聚合查询,以确保仅存在一行并且其类型等于'a'

      SELECT id
      FROM t1
      GROUP BY id
      HAVING COUNT(*) = 1 and SUM(DECODE(type, 'a', 0, 1)) = 0
      

      【讨论】:

        【解决方案3】:

        我会这样做:

        SELECT id
        FROM t1
        GROUP BY id
        HAVING COUNT(*) = 1 AND MIN(type) = 'a';
        

        【讨论】:

        • 谢谢,我认为这是更好的解决方案
        【解决方案4】:

        您需要在group by 子句中使用id,只需使用having 子句过滤掉types:

        SELECT id
        FROM t1
        GROUP BY id
        HAVING MIN(type) = MAX(type) AND MIN(type) = 'a';
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-03
          • 1970-01-01
          • 2021-08-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多