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。戻してはいけません。102または100、これらのIDに少なくとも1つあるためIsBad=0です。

以下のクエリを試してみました

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

このクエリには、すべてを含むIDが含まれますIsBad=0。しかし、私はそれを必要としません。havingを使用して句にさらに条件を追加しようとしまし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
        )

SQLFiddleでの実例。

を探しているだけの場合は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て一致するものがないかどうかを確認することで、このパフォーマンスの問題を回避します。

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 に答える