Объединение двух запросов в один - Oracle - PullRequest
0 голосов
/ 07 июня 2018

Попытка объединить следующие два запроса, которые включают отрицания и заканчивают тем, что также удаляли необходимые строки.Если запустить их отдельно с помощью MINUS, я получу требуемый результат.

 SELECT *
      FROM table1 t1
     WHERE t1.b_c IN ('A', 'B') AND t1.d_id IN ('2', '3')
           AND ( (t1.a_d >= '1-May-2018'AND t1.a_d <= '15-May-2018')
                OR (t1.a_r >= '1-May-2018'  AND t1.a_r <= '15-May-2018'))
           AND (    t1.a_m = 'AC'
                AND t1.s = 'SW'
                AND t1.c_m IN ('DM', 'SW')
                AND t1.d_m IN ('DM', 'SW')
                OR ((t1.a_m = 'NO' AND t1.s = 'SW')
  AND (   (t1.d_m = 'DM' AND t1.c_m = 'DM')
       OR (t1.d_m = 'SW' AND t1.c_m = 'DM')
       OR NOT (t1.d_m = 'DM' AND t1.c_m = 'SW')
       OR (t1.d_m = 'SW' AND t1.c_m = 'SW'))))
           AND ( (t1.a_m,t1.s,t1.d_m,t1.c_m,t1.d_s) NOT IN
  ( ('NO', 'SW', 'SW', 'DM', 'X001'),
   ('NO', 'SW', 'SW', 'DM', 'XXXX')))

    MINUS
    (SELECT *
       FROM table1 t1
      WHERE t1.b_c IN ('A', 'B') AND t1.d_id IN ('2', '3')
            AND ( (t1.a_d >= '1-May-2018' AND t1.a_d <= '15-May-2018')
                 OR (t1.a_r >= '1-May-2018'   AND t1.a_r <= '15-May-2018'))
            AND t1.dept_id IN ('20', '35')
            AND t1.a_m IN ('AC', 'NO')
            AND t1.s = 'SW'
            AND t1.c_m = 'DM'
            AND t1.d_m IN ('DM', 'SW')
            AND ((t1.o_b = 'X001' AND t1.s_s = 'X001' ) OR (t1.o_b = 'XXXX'   AND t1.s_s = 'XXXX'))
            AND REGEXP_LIKE (t1.r_no, '^(20PS|35RE)'))

Комбинированный запрос:

SELECT *
  FROM table1 t1
 WHERE t1.b_c IN ('A', 'B') AND t1.d_id IN ('2', '3')
       AND ( (t1.a_d >= '1-May-2018' AND t1.a_d <= '15-May-2018')
            OR (t1.a_r >= '1-May-2018' AND t1.a_r <= '15-May-2018'))
       AND t1.a_m IN ('AC', 'NO')
       AND t1.s = 'SW'
       AND t1.c_m IN ('DM', 'SW')
       AND t1.d_m IN ('DM', 'SW')
       AND (NOT ( ( (t1.a_m, t1.s, t1.d_m, t1.c_m, t1.d_s) IN
                       ( ('NO', 'SW', 'SW', 'DM', 'X001'),
                        ('NO', 'SW', 'SW', 'DM', 'XXXX')))
                 OR ( (t1.s, t1.d_m, t1.c_m) IN ( ('SW', 'DM', 'SW')))
                 OR ( ( (t1.a_m, t1.s, t1.d_m, t1.c_m, t1.o_b, t1.b_b, t1.s_s) IN
                           ( ('AC', 'SW', 'DM', 'DM', 'XXXX', 'X001', 'XXXX'),
                            ('AC', 'SW', 'DM', 'DM', 'X001', 'XXXX', 'X001'))
                       AND REGEXP_LIKE (t1.r_no, '^(20PS|35RE)')))))

Когда я запустил комбинированный запрос, следующая требуемая строка была удалена.

t1.a_m t1.s t1.d_m t1.c_m t1.o_b t1.b_b t1.s_s t1.r_no
AC     SW   DM     DM                          35REXXXX

Пожалуйста, дайте мне знать, где я допустил ошибку.

1 Ответ

0 голосов
/ 07 июня 2018

Это очень наивный подход, но я думаю, что он будет работать для вас.

SELECT *
      FROM table1 t1
     WHERE t1.b_c IN ('A', 'B') AND t1.d_id IN ('2', '3')
           AND ( (t1.a_d >= '1-May-2018'AND t1.a_d <= '15-May-2018')
                OR (t1.a_r >= '1-May-2018'  AND t1.a_r <= '15-May-2018'))
           AND (    t1.a_m = 'AC'
                AND t1.s = 'SW'
                AND t1.c_m IN ('DM', 'SW')
                AND t1.d_m IN ('DM', 'SW')
                OR ((t1.a_m = 'NO' AND t1.s = 'SW')
  AND (   (t1.d_m = 'DM' AND t1.c_m = 'DM')
       OR (t1.d_m = 'SW' AND t1.c_m = 'DM')
       OR NOT (t1.d_m = 'DM' AND t1.c_m = 'SW')
       OR (t1.d_m = 'SW' AND t1.c_m = 'SW'))))
           AND ( (t1.a_m,t1.s,t1.d_m,t1.c_m,t1.d_s) NOT IN
  ( ('NO', 'SW', 'SW', 'DM', 'X001'),
   ('NO', 'SW', 'SW', 'DM', 'XXXX')))
  -- added this:
  AND NOT (t1.dept_id IN ('20', '35')
            AND t1.a_m IN ('AC', 'NO')
            AND t1.s = 'SW'
            AND t1.c_m = 'DM'
            AND t1.d_m IN ('DM', 'SW')
            AND ((t1.o_b = 'X001' AND t1.s_s = 'X001' ) OR (t1.o_b = 'XXXX'   AND t1.s_s = 'XXXX'))
            AND REGEXP_LIKE (t1.r_no, '^(20PS|35RE)')))
;

Я просто взял части условий MINUS, которые отличались от исходного набора, и добавил ихс NOT.

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

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