【问题标题】:Filter SQL rows with non unique IDs on another value在另一个值上过滤具有非唯一 ID 的 SQL 行
【发布时间】:2021-04-02 22:01:56
【问题描述】:

我有一个相当大的 SQL 请求,它产生以下语句(为清楚起见进行了简化):

但是,我需要过滤此结果,并且只获取 NO CapacityId = 4 的 LabId。 在此示例中,预期结果仅为 LabId 7

这里是重现情况的小提琴:http://sqlfiddle.com/#!18/e581a/2

有了这个请求:

CREATE TABLE Lab (LabId int, CapacityId int)

INSERT INTO Lab (LabId, CapacityId)
VALUES (1, 1), (1, 2), (1, 3), (1, 4), (2, 1),(2, 2)

SELECT LabId 
FROM Lab 
WHERE CapacityId != 4
GROUP BY LabId

它仍然会检索两个 Lab,因为两者都至少有一行 CapacityId != 4

我应该如何WHERE/GROUP BY 才能只获得 NO CapacityId = 4 的实验室?

【问题讨论】:

    标签: sql sql-server filter where-clause


    【解决方案1】:

    你可以使用having:

    SELECT LabId 
    FROM Lab 
    GROUP BY LabId
    HAVING SUM(CASE WHEN CapacityId = 4 THEN 1 ELSE 0 END) = 0;
    

    SUM() 将每个具有4 容量的LabId 的行数相加。 = 0 指定没有。

    注意:这不会返回在此表中没有行的LabIds(在技术上也满足此条件)。为此,请使用NOT EXISTS。让我假设这些表的名称有点不同:

    SELECT l.LabId 
    FROM Labs l
    WHERE NOT EXISTS (SELECT 1
                      FROM LabCapacity lc
                      WHERE lc.LabId = l.LabId AND
                            lc.CapacityId = 4
                     );
    

    【讨论】:

      【解决方案2】:

      你可以在这里使用存在逻辑:

      SELECT l1.LabId
      FROM Lab l1
      WHERE NOT EXISTS (SELECT 1 FROM Lab l2 WHERE l2.LabId = l1.LabId AND
                                                   l2.CapacityId = 4);
      

      你也可以使用聚合:

      SELECT LabId 
      FROM Lab 
      GROUP BY LabId
      HAVING COUNT(CASE WHEN CapacityId = 4 THEN 1 END) = 0;
      

      【讨论】:

        【解决方案3】:

        使用解析函数

        SELECT LabId 
        FROM (select labId, CapacityId, 
                sum(case when CapacityId=4 then 1 else 0 end) over(partition by labId) cnt_capacyty4
               from Lab
             ) 
        WHERE cnt_capacyty4 = 0
        GROUP BY LabId
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多