2016-10-13 1 views
0

У меня есть таблица A, которая имеет 85337 строк (Total).T-SQL Multiple Negative, если условия

Затем следующий запрос (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 строки. (Должен вернуть 84747)

  • Почему (Total) не равен сумме (Q1) + (Q2)?
  • Почему во втором запросе должно быть «OR» вместо «AND», чтобы получить «правильные» значения, когда логика одинакова? Это должно быть тривиально, но не может представить логику.
+0

Почему вы Ожидайте, что Total будет равна количеству Q1 + Q2? Очевидно, что ваши данные не так. –

ответ

0

основе De Morgan's laws на Отрицание:

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

Не работает, если 'P' ИЛИ' Q' является трехзначным логическим предикатом. –

0

Это происходит потому, что ваши два запроса не инкапсулировать все возможные комбинации данных, как вы используете AND:

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; 

 Смежные вопросы

  • Нет связанных вопросов^_^