仅在任何行中都不存在值时查询返回结果

时间:2019-01-17 16:43:41

标签: sql oracle

不确定标题是否能很好地说明这一点,但是我有一个记录表。假设我有StatusCapture_IDOrder_ID列。我正在尝试获取所有Status的列表,这些列表在订单包含的任何行中都不包含Complete的{​​{1}}。每个Order_ID可以有多个条目。

所以行看起来像:

ORDER_ID      STATUS      Capture_ID
1245          COMPLETE    999
1245          ASSIGNED    999
1245          FAILED      999

因此,我编写了一个查询,该查询返回的结果不包含“完成”。它只是返回失败的结果,问题是它不检查ORDER_ID是否具有其他包含COMPLETE的行。

Capture_ID用于跟踪订单状态。 Order_ID可能还有其他9行与其他操作有关,但是capture_ID被分配给该订单,并具有3个可能的失败,已分配,已完成条目。所有其他行的Cpature_ID将为空

2 个答案:

答案 0 :(得分:2)

如果只希望表格中的订单,则可以使用group byhaving

select order_id
from t
group by order_id
having sum(case when status = 'COMPLETE' then 1 else 0 end) = 0;

如果要针对所有订单运行此命令,那么我假设您有一个orders表。使用not exists

select o.*
from orders o
where not exists (select 1
                  from orderstatuses os
                  where os.order_id = o.order_id and
                        os.status = 'COMPLETE'
                 );

答案 1 :(得分:0)

我认为这个问题要求使用MINUS命令。

Select distinct(order_id)
  from {table_name}
MINUS
Select distinct(order_id)
  from (table_name}
where status = 'Complete'

您可以根据需要从此SQL中获取输出,并将其用于进一步的查询。