0

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

CREATE TABLE [dbo].[Data](
    [Id] [int] NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    [IsBad] [bit] NOT NULL
) ON [PRIMARY]
GO

Insert into Data  values(100,'Book!',1)
Insert into Data  values(100,'Booklki**',1)
Insert into Data  values(100,'Book',0)
Insert into Data  values(100,'New Book ~~',1)
Insert into Data  values(100,'New Book',0)
Insert into Data  values(100,'B00k…>',1)
Insert into Data  values(101,'Tim3#',1)
Insert into Data  values(101,'%Timer%',1)
Insert into Data  values(101,'T1mer**',1)
Insert into Data  values(101,'Tim6',1)
Insert into Data  values(101,'Time@me',1)
Insert into Data  values(102,'ABC',0)
Insert into Data  values(102,'CDE',0)

我需要选择所有ID拥有的所有IsBad = 1. 因此,查询上表将返回 ID: 101。它不能返回102100因为这些 ID 至少有一个IsBad=0.

我试过下面的查询

select id,count(distinct isBad) as Total
from Data
group by id
having count(distinct isBad)= 1 

此查询包括所有IsBad=0. 但我不需要那个。having我尝试在using 子句中添加更多条件AND,但出现错误。

如何进行 ?任何帮助表示赞赏。

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

4

3 回答 3

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

SQL Fiddle 上的实时示例。

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

select  distinct id
... rest of the query is the same ...
于 2013-01-29T09:21:58.670 回答
2

反转它 - 你想要“所有 IsBad = 1 的所有 ID”,这意味着 ID 不能有任何 IsBad = 0:

SELECT ID FROM Data WHERE ID NOT IN (
    SELECT ID FROM Data WHERE IsBad = 0
)
于 2013-01-29T09:32:35.357 回答
0

当前答案的缓慢可能是由于使用了where not exists从句。left join我通常通过使用 a并检查是否缺少匹配来解决这个性能问题。

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

这是一篇旧帖子,因此它可能对最初的个人没有帮助,但也许其他人会受益。

于 2017-08-24T22:37:09.117 回答