Sql have子句中的多重条件

Sql have子句中的多重条件,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我有一个如下表(使用SQL server 2008 R2): 我需要选择所有的ID,它们都有IsBad=1。所以,查询上面的表将返回ID:101。它不能返回102或100,因为这些ID至少有一个IsBad=0 我试着在下面提问 select id,count(distinct isBad) as Total from Data group by id having count(distinct isBad)= 1 此查询包括具有所有IsBad=0的ID。但是我不需要。我试图使用和在havin

我有一个如下表(使用SQL server 2008 R2):

我需要选择所有的
ID
,它们都有
IsBad=1
。所以,查询上面的表将返回ID:
101
。它不能返回
102
100
,因为这些ID至少有一个
IsBad=0

我试着在下面提问

select id,count(distinct isBad) as Total
from Data
group by id
having count(distinct isBad)= 1 
此查询包括具有所有
IsBad=0
的ID。但是我不需要。我试图使用
having
子句中添加更多的条件,但出现了错误

如何进行?感谢您的帮助

编辑:我需要对一个有5000万条记录的表运行查询。因此,需要优化查询以在更短的时间内返回结果

select  *
from    Data d1
where   not exists 
        (
        select  *
        from    Data d2
        where   d1.id = d2.id
                and d2.IsBad = 0
        )

如果您只是在查找
id
,可以使用:

select  distinct id
... rest of the query is the same ...

如果您只是在查找
id
,可以使用:

select  distinct id
... rest of the query is the same ...
反向-您想要“所有的ID都有IsBad=1”,这意味着该ID不能有任何IsBad=0:

SELECT ID FROM Data WHERE ID NOT IN (
    SELECT ID FROM Data WHERE IsBad = 0
)
反向-您想要“所有的ID都有IsBad=1”,这意味着该ID不能有任何IsBad=0:

SELECT ID FROM Data WHERE ID NOT IN (
    SELECT ID FROM Data WHERE IsBad = 0
)

当前答案的缓慢可能是由于在不存在的地方使用了
子句。我通常通过使用
左连接
并检查是否缺少匹配来解决性能问题

select *
from Data d1
left join (select * from Data where IsBad = 0) d2
  on d1.id = d2.id
where d2.id is null

这是一篇老文章,因此它可能不会帮助原始个人,但可能其他人会受益。

当前答案的缓慢可能是由于在不存在的地方使用了
子句。我通常通过使用
左连接
并检查是否缺少匹配来解决性能问题

select *
from Data d1
left join (select * from Data where IsBad = 0) d2
  on d1.id = d2.id
where d2.id is null

这是一篇老文章,所以它可能不会帮助最初的个人,但可能其他人会受益。

+1:像这样。。。我需要对一个有5000万条记录的表运行这个查询。因此,查询需要花费大量时间。这可以优化吗?我已经编辑了我的问题。在
(id,IsBad)
上添加索引将有助于+1:像这样。。。我需要对一个有5000万条记录的表运行这个查询。因此,查询需要花费大量时间。这可以优化吗?我已经编辑了我的问题。在
(id,IsBad)
上添加索引将有助于+1进行最简单的查询。。。然而,对于一个有大约50万条记录的表来说,执行这些操作需要很长的时间……这些操作可以优化以在更短的时间内返回结果吗?+1对于最简单的查询。。。然而,对于一个有大约5000万条记录的表来说,执行这些操作需要很长的时间……是否可以优化这些操作以在更短的时间内返回结果?