-1

これがシナリオです。idとIsNotValidの2つの列を持つ単一のSQLServer2008テーブル(Products)があります。データは次のようになります。

id     IsNotValid
1        0
1        0
1        1
2        0
2        0
3        1
3        1

id = 2のすべてのレコード(2)を返す結果セットを返すSQLステートメントが必要です-この場合、id=2のすべてのIsNotValid値は0です。id=1は1つとして返されるべきではありませんそのIsNotValidレコードの1です。id=3についても同様です。データ型は、id(int)、IsNotValid(bit)です。

4

4 に答える 4

3

これにより、必要な結果が得られるはずです。

SELECT * FROM Products WHERE id NOT IN
(SELECT id FROM Products WHERE IsNotValid = 1)
于 2012-10-18T00:13:11.003 に答える
3

ここにいくつかの方法があります

Declare @t table (Id Int, IsnotValid Bit)
Insert Into @t Values(1,0),(1,0),(1,1),(2,0),(2,0),(3,1),(3,1)

アプローチ1:

SELECT * FROM @t WHERE Id NOT IN (SELECT Id FROM @t WHERE IsnotValid=1) 

アプローチ2:

SELECT * 
FROM @t T1 
WHERE IsnotValid = 0 
AND NOT EXISTS ( 
    SELECT *  
    FROM @t T2  
    WHERE T1.Id = T2.Id 
    AND T2.IsnotValid <> 0) 

アプローチ3:

SELECT * 
FROM @t T1 
WHERE IsnotValid = 0 
AND Id NOT IN ( 
    SELECT Id  
    FROM @t T2  
    WHERE T2.IsnotValid <> 0) 

アプローチ4:

SELECT T1.* 
FROM @t T1 
LEFT OUTER JOIN @t T2 ON T1.Id = T2.Id AND T2.IsnotValid <> 0 
WHERE T1.IsnotValid = 0 
AND T2.Id IS NULL 

アプローチ5:

select Id,IsnotValid
from (select t.*, SUM(CAST(IsnotValid AS INT)) over (partition by Id) as sumflag 
      from @t t 
     ) t 
where sumflag = 0 

アプローチ6:

;with cte as( 
    Select  
        Id = Case when x.Id is null then y.Id else x.Id end  
        ,x.CountFor0 
        ,y.CountFor1 
    From  
            (Select Id,CountFor0 = count(*) 
            from @t  
            where IsnotValid = 0 
            group by Id )x 
    Full Join  

            (Select Id,CountFor1 =count(*) 
            from @t  
            where IsnotValid = 1 
            group by Id )y 
    On x.Id = y.Id) 

    Select Id 
    From cte 
    where CountFor1 is null 

結果

Id  IsnotValid
2   0
2   0
于 2012-10-18T04:36:01.090 に答える
1

あなたが何かを試みて、あなたが試みたことを示したら、それは良いことです。

0は「良い」を表し、1は「悪い」を表すので、

SELECT id FROM yourtable GROUP BY id HAVING SUM( IsNotValid ) = 0

これにより、すべてのIsNotValidがゼロであるこれらのIDのみが一覧表示されます。

于 2012-10-18T00:18:01.687 に答える
0

これを行う別の方法は次のとおりです。

-- using CTE and a join
with MyCte as
(
select id from Products 
where IsNotValid = 1
group by id
)
select a.* from Products a
    left join MyCte b
    on a.id = b.id
where b.id is null
于 2012-10-18T00:20:53.183 に答える