Как запросить таблицу истории, если статус не найден? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть таблица ORDERS, у каждого ORDER_ID может быть несколько статусов.

ORDER_ID |    STATUS
---------|-------------
1001     |    Requested
1001     |     Approved
1001     |     Invoiced
1001     |     Received
1001     |    Delivered
1011     |    Requested
1011     |     Approved
1011     |     Invoiced
1011     |    Delivered

Мне нужно идентифицировать ORDER_ID s, у которых есть Доставлено STATUS, но не Получено STATUS.

ex: нижеуказанный ордер не имеет статуса Получено.

ORDER_ID
--------
1011

Я пытался сделать запрос, используя group by having count < 5, но он не работает Я попытался получить все заказы, которые имеют статус Delivered во внутреннем запросе, и попытался получить заказы, которые имеют статус Delivered, но не Received. который тоже не работает. что-то вроде ниже

select order_id from orders where status !=Received and order_id in 
(select order_id from orders where status==delivered)

что такое правильный запрос?

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Oracle поддерживает оператор MINUS.

SELECT order_id
FROM orders
WHERE status = 'Delivered'
MINUS
SELECT order_id
FROM orders
WHERE status = 'Received'

Примечание. Кто-то предоставил этот ответ раньше, чем я, но удалил его?

0 голосов
/ 29 августа 2018

Я бы использовал NOT EXISTS:

SELECT o.*
FROM orders o
WHERE STATUS = 'Delivered' AND
      NOT EXISTS (SELECT 1 FROM orders o1 WHERE o1.order_id = o.order_id AND o1.STATUS = 'Received');
0 голосов
/ 29 августа 2018

Использование условного агрегирования.

select order_id 
from orders
group by order_id
having count(case when status='Delivered' then 1 end) > 0
and count(case when status='Received' then 1 end) = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...