Как принять отрицание, когда два или более условия выполняются - PullRequest
0 голосов
/ 26 апреля 2018

В приведенной ниже таблице каждая строка представляет условие. Что я пытаюсь получить, так это то, что если данное условие истинно, мне нужно получить его отрицание. У меня проблема в том, что когда я получаю отрицание, некоторые необходимые данные удаляются.

Метод, который я попробовал, заключается в следующем.

Пожалуйста, найдите запрос, который я написал ниже.

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%'))

Я использовал отдельный запрос и взял МИНУС из основного набора.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Благодаря Ponder Stibbons я смог добиться желаемых результатов, но я не уверен, что это лучший способ. Если кто-то может предложить что-то лучшее, действительно это желательно.

/* Formatted on 27/04/2018 11:19:46 AM (QP5 v5.150) */
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_c = '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 (t1.b_s, t1.d_w) NOT IN
                        ( ('B', 'A')))
            OR (    t1.s_r = 'SW'
                AND t1.d_m = 'SW'
                AND t1.c_m = 'DM'
                AND t1.d_w NOT IN ('A', 'B')))

MINUS
(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 a_c IN ('AC', 'NO')
        AND s_r IN ('EB', 'SW')
        AND d_m IN ('DM', 'SW')
        AND c_m = 'DM'
        AND (o_s,s_w) IN
                (( 'A', 'A'))
        AND r_n LIKE '35RE%'

 UNION ALL

 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 a_c = 'NO'
        AND s_r = 'EB'
        AND d_m = 'SW'
        AND c_m = 'DM'
        AND (t1.b_s, t1.d_w) IN
                ( ('A', 'B'))
     ) 
0 голосов
/ 26 апреля 2018

Если я правильно понял, вы могли бы использовать это:

select * 
  from eft_txn_details 
  where (s_r, d_m, c_m, o_s, b_s, r_n) not in (('SW', 'SW', 'DM', 'A', 'A', '35RE'))
    and (s_r, d_m, c_m, o_s, b_s, r_n) not in (('SW', 'SW', 'DM', 'B', 'B', '35RE'))
    and (s_r, d_m, c_m, b_s, d_w)      not in (('SW', 'SW', 'DM', 'B', 'A'))
    and (s_r, d_m, c_m, b_s, d_w)      not in (('SW', 'SW', 'DM', 'A', 'B'))
    and (s_r, d_m, c_m, o_s, b_s, r_n) not in (('EB', 'SW', 'DM', 'A', 'A', '35RE'))
    and (s_r, d_m, c_m, o_s, b_s, r_n) not in (('EB', 'SW', 'DM', 'B', 'B', '35RE'))
    and (s_r, d_m, c_m, b_s, d_w)      not in (('EB', 'SW', 'DM', 'B', 'A'))
    and (s_r, d_m, c_m, b_s, d_w)      not in (('EB', 'SW', 'DM', 'A', 'B'))

Добавить условия для дат и т. Д. Вы можете упростить этот синтаксис, но таким образом его легче читать, по крайней мере, для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...