【问题标题】:How to find unique row other than null for the same ID? [closed]如何为同一 ID 找到除 null 之外的唯一行? [关闭]
【发布时间】:2021-05-28 23:40:38
【问题描述】:

我有一个下表数据,其中包含带有 null 的状态列和 'Y'ID

Id      Name    Status
1394    Test 1  Y
1394    Test 2  null    
1394    Test 3  null    
1395    Test 4  Y
1395    Test 5  Y
1396    test 6  null

ID 1394 包含 nullY。 如果ID 包含Null 那么我不应该得到ID

在这种情况下,我应该只得到1395,因为特定的ID 不包含null 值。

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008 rdbms


    【解决方案1】:

    还有一个选择:

    SELECT Id from tablename
    EXCEPT 
    SELECT Id FROM tablename WHERE Status IS NULL;
    

    第一条语句获取所有 ID 值的集合。第二个获取状态为 NULL 的所有 ID 值的集合。 EXCEPT 从第一组中删除第二组以及重复项。请注意,没有 ORDER BY 子句,因此不要假设行具有已定义的顺序。 Fiddle

    【讨论】:

      【解决方案2】:

      HAVING 子句中使用条件聚合:

      SELECT Id, MAX(Status) Status
      FROM tablename
      GROUP By Id
      HAVING SUM(CASE WHEN Status IS NULL THEN 1 ELSE 0 END) = 0
      

      或者如果你想要所有的行和列都使用 NOT IN:

      SELECT *
      FROM tablename
      WHERE Id NOT IN (SELECT Id FROM tablename WHERE Status IS NULL)
      

      【讨论】:

        【解决方案3】:

        我会在这里使用聚合方法:

        SELECT Id
        FROM yourTable
        GROUP BY id
        HAVING COUNT(CASE WHEN Status IS NULL THEN 1 END) = 0;
        

        【讨论】:

          【解决方案4】:

          你可以使用not exists:

          select t.*
          from t
          where not exists (select 1
                            from t t2
                            where t2.id = t.id and t2.status is null
                           );
          

          【讨论】:

          • 这行得通。如果我的行包含十万数据怎么办
          • @sampathacharya 这是过早的优化吗?先试试看。还是您的问题只是通往实际问题之路的开始?
          • @SMor 好的,我会尝试得到结果。谢谢
          • @sampathacharya 。 . .奇怪的是你没有接受这个答案,因为在(id, status) 上有一个索引,这将有最好的性能。
          猜你喜欢
          • 2020-10-04
          • 1970-01-01
          • 2014-05-07
          • 2021-04-12
          • 2019-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-24
          相关资源
          最近更新 更多