2012-10-18 87 views
-1

這裏是場景。我有一個單一的SQL Server 2008表 - 產品 - 有2列:id和IsNotValid。這些數據將是這個樣子:如何根據布爾列中的值返回sql結果

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

我想一個SQL語句,將返回的結果集將返回所有的記錄(2)爲ID = 2 - 在這種情況下,所有的IsNotValid值id = 2是0. id = 1不應該作爲其IsNotValid記錄之一返回。類似於id = 3。數據類型是:id(int),IsNotValid(bit)。

回答

3

這應該給你你想要的結果:

SELECT * FROM Products WHERE id NOT IN 
(SELECT id FROM Products WHERE IsNotValid = 1) 
+0

運行此針對上述樣本數據返回2個記錄其中id = 1是0。我只想ID = 2,其中所有IsNotValid is 0 – soulia

+0

@soulia這個查詢*完全*與接受的答案的方法1相同,就是你說的爲你工作的答案。你輸入的內容是否正確? – gcochard

+0

嗨格雷格 - 是的,你是對的。我一定錯了什麼。感謝您將此引起我的注意。 – soulia

1

,如果你嘗試過的東西,顯示您是否嘗試過什麼這將是一件好事。

因爲0代表「好」和1個「壞」,我會做

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

這將只列出這些ID的所有IsNotValid爲零。

+0

感謝您的回覆。 SUM(IsNotValid)似乎不適用於類型位。 – soulia

+0

對不起。我不知道這是一種類型。那麼格雷格的答案是最好的。 – Grzegorz

+0

我的錯誤,我沒有指定數據類型 - IsNotValid是類型位。如果這不是直截了當的,我可能會認輸。 – soulia

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 
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 
+0

Niladri - 方法1工作正常。我添加了DISTINCT來返回Id而不是整個結果集。謝謝! – soulia