2016-10-13 12 views
0

85337(Total)のテーブルAがあります。T-SQL複数の否定条件

そして、次のクエリ(Q1)

SELECT * 
FROM A 
WHERE 1 = 1 
     AND c1 = 0 
     AND c2 = 0 
     AND c3 = 0 
     AND c4 = 0; 

590行を返します。

次のクエリ(Q2)

SELECT * 
FROM A 
WHERE 1 = 1 
     AND c1 != 0 
     AND c2 != 0 
     AND c3 != 0 
     AND c4 != 0; 

リターン:44245行。 (Total)(Q1) + (Q2)の同等の合計をしない理由

  • (84747を返す必要がありますか)?
  • ロジックが同じときに "正しい"値を取得するために、2番目のクエリで "AND"の代わりに "OR"が必要なのはなぜですか?それは些細なものでなければなりませんが、その背後にある論理を想像することはできません。否定のDe Morgan's lawsに基づいて
+0

なぜだろうTotalはQ1 + Q2の量と等しいと思いますか?あなたのデータは明らかにそのような方法ではありません。 –

答えて

0

:あなたはANDを使用しているとして、あなたの2つのクエリは、あなたのデータのすべての組み合わせをカプセル化していないので、

NOT (P AND Q) => (NOT P OR NOT Q) 
+0

'P'または' Q'が3値の論理述語である場合、機能しません。 –

0

これは、次のとおりです。

declare @a table (c1 int,c2 int,c3 int,c4 int); 
insert into @a values 
(1,1,1,1) 
,(0,0,1,1) -- This row is not returned as it doesn't meet either criteria below 
,(0,0,0,0) 
,(0,0,0,0); 

SELECT * 
FROM @a 
WHERE 1 = 1 
     AND c1 = 0 
     AND c2 = 0 
     AND c3 = 0 
     AND c4 = 0; 

SELECT * 
FROM @a 
WHERE 1 = 1 
     AND c1 != 0 
     AND c2 != 0 
     AND c3 != 0 
     AND c4 != 0;