微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在sql oracle中有效地找到已删除的职位

如何解决在sql oracle中有效地找到已删除的职位

我的桌子很大,有数百万个采购订单。 我也尝试从性能的角度寻找一种更好的方法来实现这一目标。

这是一些样本数据,每个订单有几个位置,位置0是标题,位置1-2是一些项目。在某些情况下,买方下了多个仓位的订单,后来他可以调整此仓位,例如删除所有仓位,在这种情况下,所有仓位也都得到了'y'且仓位为0(在我们的案例中为6月份的order2) 。在某些情况下,他不会像我们简单的数据集(六月的order1)中那样只删除所有一个

create table orders (
po varchar2(6),pos number,flag char(1),datum date
)

insert into orders values ('order1','n',to_date('01-01-2020','dd-MM-yyyy'));
insert into orders values ('order1',1,2,to_date('01-06-2020','y','dd-MM-yyyy'));

insert into orders values ('order2','dd-MM-yyyy'));
insert into orders values ('order2','dd-MM-yyyy'));

目标是仅查找具有至少一个删除位置的订单名称(位置0除外,这将通过删除所有1-2位来自动设置)

在我们的例子中,结果仅为order1

这当然是行不通的

select distinct po from orders where pos <> 0 and flag = 'y';

解决方案是子查询或相关子查询

select distinct po from orders
where pos <> 0 and flag = 'y'
and po not in (
select distinct po from orders
where pos = 0 and flag = 'y');

但是我不知道从性能角度看是否有更好的解决方案,因为 该表被查询了两次,并且有大量的订单,这当然太慢了

有什么想法吗?

解决方法

使用聚合:

select po
from orders o
group by po
having sum(case when pos = 1 and flag = 'y' then 1 else 0 end) = 0 and
       sum(case when flag = 'y' then 1 else 0 end) > 0;
   
,

您可能需要条件聚合

select po
from tab
group by po
having max(case when pos <> 0 then flag end) = 'y' -- at least one deleted position
   and max(case when pos =  0 then flag end) = 'n' -- but no deleted header

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?