В приведенной ниже таблице каждая строка представляет условие. Что я пытаюсь получить, так это то, что если данное условие истинно, мне нужно получить его отрицание.
У меня проблема в том, что когда я получаю отрицание, некоторые необходимые данные удаляются.
Метод, который я попробовал, заключается в следующем.
Пожалуйста, найдите запрос, который я написал ниже.
s_r d_m c_m o_s b_s d_w r_n
SW SW DM A A 35RE%
SW SW DM B B 35RE%
SW SW DM B A
SW SW DM A B
EB SW DM A A 35RE%
EB SW DM B B 35RE%
EB SW DM B A
EB SW DM A B
SELECT *
FROM e_t t1
WHERE ( (t1.a_date >= '16-Mar-2018' AND t1.a_date <= '31-Mar-2018')
OR (t1.r_date >= '16-Mar-2018' AND t1.r_date <= '31-Mar-2018'))
AND t1.a_m = 'NO'
AND ( ( t1.s_r IN ('EB', 'PH', 'PT', 'SW')
AND t1.d_m IN ('DM', 'SW')
AND t1.c_m = 'SW')
OR (t1.s_r IN ('PH', 'PT') AND t1.d_m = 'SW' AND t1.c_m = 'DM')
OR ( (t1.s_r = 'EB' AND t1.d_m = 'SW' AND t1.c_m = 'DM')
AND (b_s != 'A' AND d_w != 'B')
AND (b_s != 'B' AND d_w != 'A'))
OR ( ( t1.s_r = 'SW'
AND t1.d_m = 'SW'
AND t1.c_m = 'DM'
AND t1.d_w NOT IN ('A', 'B'))
AND o_s != 'A'
AND r_n != '35RE%'))
Обновление по запросу
Приведенный ниже запрос разработан на основе первой строки таблицы выше.
SELECT * FROM e_t t1 WHERE t1.s_r = 'SW'
AND t1.d_m = 'SW'
AND t1.c_m = 'DM'
AND t1.d_w IN ('A', 'B')
A_M S_R D_M C_M B_S D_W
NO SW SW DM A A
NO SW SW DM A A
NO SW SW DM A A
NO SW SW DM B A
NO SW SW DM B A
NO SW SW DM B A
NO SW SW DM B A
Под отрицанием, которое я имел в виду, я не хочу, чтобы этот результат появлялся в моем конечном результате. Для этого я сделал следующее.
SELECT * FROM e_t t1 WHERE t1.s_r = 'SW'
AND t1.d_m = 'SW'
AND t1.c_m = 'DM'
AND t1.d_w **NOT** IN ('A', 'B')
Надеюсь, приведенное выше объяснение прояснит ваши сомнения.
Update 27/04/2018
Спасибо всем, кто помогал до сих пор. Основываясь на Ponder Stibbons, я обновил запрос следующим образом. Но этот запрос удаляет 5 обязательных строк данных при правильном получении остальных.
В соответствии с таблицей условий ниже, я хочу взять отрицание и использовать следующее.
s_r d_m c_m o_s b_s d_w r_n
EB SW DM B A
EB SW DM A B
(s_r, d_m, c_m, b_s, d_w) not in
(('EB', 'SW', 'DM', 'B', 'A'),('EB', 'SW', 'DM', 'A', 'B'))
Но это удаляет следующий набор данных. Что я не могу понять, почему.
s_r d_m c_m o_s b_s d_w r_n
EB SW DM A
Кроме того, так как я не мог решить ниже,
(s_r, d_m, c_m, o_s, b_s, r_n) not in (('SW', 'SW', 'DM', 'A', 'A', '35RE%')
)
Я использовал отдельный запрос и взял МИНУС из основного набора.