Как использовать EXISTS в Oracle SQL - PullRequest
0 голосов
/ 17 октября 2019

Я хочу получить все записи, показывающие только идентификаторы, которые не прошли через статус = 2, но были отменены из определенных статусов. Таблицы A_ORDERS_LOG и A_ORDERS.

Таким образом, каждый идентификатор может проходить различные статусы. Мне интересно видеть только те идентификаторы, которые были отменены из определенных статусов и не прошли через статус = 2.

Я пробовал это

SELECT *
  FROM A_ORDERS_LOG
 WHERE ( STATUS1 = 0  AND STATUS2  = 11 )
    OR ( STATUS1 = 1  AND STATUS2  = 11 )
    OR ( STATUS1 = 3  AND STATUS2  = 11 )
    OR ( STATUS1 = 4  AND STATUS2  = 11 )
    OR ( STATUS1 = 41 AND STATUS2  = 11 )
    OR ( STATUS1 = 42 AND STATUS2  = 11 )
    OR ( STATUS1 = 43 AND STATUS2  = 11 )
    OR ( STATUS1 = 5  AND STATUS2  = 11 )
    OR ( STATUS1 = 6  AND STATUS2  = 11 )
   AND EXISTS (
       SELECT STATUS1,
              STATUS2
         FROM A_ORDERS_LOG
        WHERE ( STATUS1 != 2 OR STATUS2 != 2 )
          AND ID IN (
              SELECT ID
                FROM A_ORDERS
       )
)
);

Status2 = 11 - означает отменуи status1 - это статус, из которого он был отменен.

Ответы [ 2 ]

1 голос
/ 19 октября 2019

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

select *
  from a_orders_log o
 where status1 in ( 0, 1, 3, 4, 5, 6, 41, 42, 43 ) and status2 = 11 
   and not exists (select 0
                     from a_orders_log aoo join a_orders ao on (ao.id=aoo.id)
                    where 2 in ( status1 , status2 ) )

@ barbaros, будет полезно, если вы можете проверить его на правильность.

Cheers !!

1 голос
/ 17 октября 2019

Похоже, вам нужен один exists и один not exists при одновременном списании статусов фильтрации сразу после предложения where:

select *
  from a_orders_log o
 where status1 in ( 0, 1, 3, 4, 5, 6, 41, 42, 43 ) and status2 = 11 
   and not exists (select 0
                     from a_orders_log o3
                    where 2 in ( status1 , status2 ) 
                      and exists ( select 1 from a_orders o2 where o2.id = o3.id ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...