2015-08-26 2 views
0

У меня есть запрос - мне нужно иметь период меньше, чем valid_to, если ou_code = 'OU140' и acc_lev6_code = 'A4900'.Как написать это заявление sql без NOT?

Мой запрос возвращает правильные результаты, но я просто хочу написать его без NOT. Я просто не могу понять это, потому что, если я напишу заявление, что период меньше valid_to, я не могу написать заявление, которое сделает данные более широкими. Редактировать: не используя ИЛИ?

with table1 (ou_code, acc_lev6_code, period, valid_to) as (
    select 'OU140', 'A4900', 201509, 201506 from dual union all 
    select 'OU140', 'A4900', 201510, 201505 from dual union all 
    select 'OU150', 'A4900', 201509, 201506 from dual union all 
    select 'OU165', 'A5200', 201509, 999999 from dual union all 
    select 'OU100', 'A5000', 201509, 201503 from dual union all 
    select 'OU150', 'A4900', 201609, 201506 from dual union all 
    select 'OU100', 'A5000', 201509, 999999 from dual union all 
    select 'OU100', 'A4900', 201509, 201506 from dual union all 
    select 'OU140', 'A5000', 201509, 999999 from dual    
) 

select 
* 
from table1 a 
where 
NOT (a.period >= a.valid_to AND NOT(a.acc_lev6_code='A4900' AND a.ou_code='OU140')) 
+3

Почему вы хотите написать его без НЕ или ИЛИ? Неясно, что вы подразумеваете под «сделать набор данных более широким»] – Ben

ответ

4

Использование d'Morgan закон:

(a.period < a.valid_to OR (a.acc_lev6_code='A4900' AND a.ou_code='OU140')) 

Пусть A : a.period < a.valid_to и B : a.acc_lev6_code='A4900' и C = a.ou_code:'OU140'

NOT(A AND NOT(B AND C)) = (NOT A OR NOT(NOT(B AND C))) 
= (NOT A OR (B AND C)) 

и

NOT A : a.period < a.valid_to 

так

(NOT A AND (B AND C)) = 
(a.period < a.valid_to OR (a.acc_lev6_code='A4900' AND a.ou_code='OU140')) 
+0

И без ИЛИ? невозможно? – user3014914

+0

@ user3014914, фактический запрос не имеет в нем 'OR'. –

2

Применяя De Morgan's принцип подстановки вы можете превратить ваш ИНЕКЕ

a.period > a.valid_to OR (a.acc_lev6_code='A4900' AND a.ou_code='OU140') 

NOT (x AND y) эквивалентно NOT x OR NOT y

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