我有一个如下表(使用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
。它不得返回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
在AND
子句中添加更多条件,但收到错误。
如何进行?任何帮助表示赞赏。
编辑:我需要针对具有5000万条记录的表运行查询。因此,需要优化查询以在更短的时间内返回结果。
答案 0 :(得分:2)
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 ...
答案 1 :(得分:2)
反转它 - 你想要“所有拥有所有IsBad = 1的ID”,这意味着ID不能有任何IsBad = 0:
SELECT ID FROM Data WHERE ID NOT IN (
SELECT ID FROM Data WHERE IsBad = 0
)
答案 2 :(得分:0)
当前答案的缓慢可能是由于使用了where not exists
条款。我通常使用left join
并检查是否缺少匹配来解决此性能问题。
select *
from Data d1
left join (select * from Data where IsBad = 0) d2
on d1.id = d2.id
where d2.id is null
这是一个老帖子,所以它可能无法帮助原始个体,但也许其他人会受益。