【问题标题】:How to select records where all of their statuses are zero?如何选择所有状态都为零的记录?
【发布时间】:2013-03-17 12:44:17
【问题描述】:

假设我有以下表格 Person tablepersonStatus table

declare @Persons table
(PersonId int)

insert into @Persons select 10   
insert into @Persons select 11    

declare @PersonStatus table
(id int,statuss int)

insert into @PersonStatus (id,statuss) values(10,0)
insert into @PersonStatus (id,statuss) values(10,0)
insert into @PersonStatus (id,statuss) values(11,1)
insert into @PersonStatus (id,statuss) values(10,0)
insert into @PersonStatus (id,statuss) values(11,0)

现在我想查找所有状态都为零的人员 ID 结果只是 ---> 10

怎么做?

【问题讨论】:

  • 要返回子表中没有行的人吗?
  • 不,这不是我的方案
  • 你想只返回所有状态为零的人吗?

标签: sql-server sql-server-2008 sql-server-2005 sql-server-2000


【解决方案1】:
SELECT  id
FROM    @PersonStatus
GROUP   BY ID
HAVING  COUNT(DISTINCT statuss) = 1 AND
        MAX(statuss) = 0

SELECT  id
FROM    @PersonStatus
GROUP   BY ID
HAVING  MAX(statuss) = MIN(statuss) AND
        MAX(statuss) = 0

【讨论】:

    【解决方案2】:

    由于我假设 @Persons 表不仅有一个 PersonId 列,而且您可能还需要其他列,因此我认为 @Persons 需要成为查询的一部分。

    SELECT p.PersonId --, other columns from p
     FROM @Persons AS p
     WHERE EXISTS (SELECT id FROM @PersonStatus
       WHERE id = p.PersonId
       GROUP BY id HAVING MAX(statuss) = 0);
    

    【讨论】:

      【解决方案3】:
      select distinct p.id from @PersonStatus as p
      where Statuss = 0
      and not exists (select null from @Personstatus as t
                      where p.id = t.id and t.statuss <> 0)
      

      【讨论】:

        猜你喜欢
        • 2021-04-29
        • 1970-01-01
        • 2018-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 2023-02-22
        相关资源
        最近更新 更多