求个高效的执行语句(oracle)

buller 2017-11-21 10:08:36
表格式如下(字段分别为ID(自增),项目ID,数量,累计数量):

ID xmid sl ljsl
1 001 2 2
2 002 3 3
3 003 2 2
4 001 1 3
5 004 2 2
6 006 1 1
7 001 2 5
8 002 -2 1

累计数量列是没有的,这里我方便查看写的,累计数量等于此xmid对应小于等于本条数据ID的sl之和
数据可能有十几万条,xmid有几千不等,有什么高效的方式更新这个ljsl?或者程序实现好点?

...全文
201 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
MERGE INTO T A USING (WITH T1 AS(SELECT T.*,ROWID AS RID,sum(s1)over(partition by xmid order by id) AS SL) SELECT * FROM T1) B ON(A.ROWID=B.RID) WHEN MATCHED THEN UPDATE SET A.LJSL=B.SL
  • 打赏
  • 举报
回复
引用 8 楼 碧水幽幽泉的回复:
[quote=引用 5 楼 baidu_36457652 的回复:]


MERGE INTO T A
USING (WITH T1 AS(SELECT T.*,ROWID AS RID,sum(s1)over(partition by xmid order by id) AS SL)
SELECT * FROM T1)
ON(A.ROWID=T1.RID)
WHEN MATCHED THEN UPDATE SET A.LJSL=B.SL
你这语句会报错的。
1.缺少别名。
2.逻辑不对:两个表的rowid匹配不上,更新0条数据。
[/quote] 嗯嗯 using 后面少了个 别名 但是逻辑应该没问题吧,rowID 不会变啊
碧水幽幽泉 2017-11-21
  • 打赏
  • 举报
回复
没问题的话,此楼结贴!
碧水幽幽泉 2017-11-21
  • 打赏
  • 举报
回复
重要的事只说一遍!
碧水幽幽泉 2017-11-21
  • 打赏
  • 举报
回复
引用 5 楼 baidu_36457652 的回复:


MERGE INTO T A
USING (WITH T1 AS(SELECT T.*,ROWID AS RID,sum(s1)over(partition by xmid order by id) AS SL)
SELECT * FROM T1)
ON(A.ROWID=T1.RID)
WHEN MATCHED THEN UPDATE SET A.LJSL=B.SL
你这语句会报错的。
1.缺少别名。
2.逻辑不对:两个表的rowid匹配不上,更新0条数据。
buller 2017-11-21
  • 打赏
  • 举报
回复
谢谢
碧水幽幽泉 2017-11-21
  • 打赏
  • 举报
回复
数据量如果很大的话,就使用merge into

merge into table_name a using (select id,sum(s1)over(partition by xmid order by id) as ljsl from table_name) b
on b.id = a.id
when matched then
set a.ljsl = b.ljsl;

commit;
  • 打赏
  • 举报
回复


MERGE INTO T  A
USING (WITH T1 AS(SELECT T.*,ROWID AS RID,sum(s1)over(partition by xmid order by id)  AS SL)
SELECT * FROM T1)
ON(A.ROWID=T1.RID)
WHEN MATCHED THEN UPDATE SET A.LJSL=B.SL
碧水幽幽泉 2017-11-21
  • 打赏
  • 举报
回复
update语句也非常简单

update table_name a
set a.ljsl = (select sum(s1)over(partition by xmid order by id) as ljsl from table_name b where b.id = a.id)
where exists(select null from table_name b where b.id = a.id);
buller 2017-11-21
  • 打赏
  • 举报
回复
引用 1 楼 qq646748739 的回复:
可以优化,以下SQL搞定:

select id,xmid,s1,sum(s1)over(partition by xmid order by id) as ljsl from table_name;
厉害! 查询可以,不过更新到这个表应该怎么写?

update  table_name set ljsl=sum(s1)over(partition by xmid order by id)  
这个有语法错误,对oracle的update语句不得要领
panjun198242 2017-11-21
  • 打赏
  • 举报
回复
select id,xmid,s1,sum(s1)over(partition by xmid order by id) as ljsl from table_name; 这个SQL确实可以
碧水幽幽泉 2017-11-21
  • 打赏
  • 举报
回复
可以优化,以下SQL搞定:

select id,xmid,s1,sum(s1)over(partition by xmid order by id) as ljsl from table_name;
oracle数据库的性能优化直接关系到系统的运行效率,而影响数据库性能的一个重要因素就是sql性能问题。本书是作者十年磨一剑的成果之一,深入分析与解剖oracle sql优化与调优技术,主要内容包括: 第一篇“执行计划”详细介绍各种执行计划的含义与操作,为后面的深入分析打下基础。重点讲解执行计划在sql语句执行的生命周期中所处的位置和作用,sql引擎如何生成执行计划以及如何获取sql语句执行计划,如何从各种数据源显示和查看已经生成的执行计划。 第二篇“sql优化技术”深入分析oracle的sql优化技术,包括逻辑优化技术和物理优化技术。用大量示例详尽分析oracle 中现有的各种查询转换技术,先分析oracle如何收集、统计系统和对象的数据,然后推导各种代价估算公式,给出各种情形下的代价计算演示。 第三篇“sql调优技术”深入剖析oracle提供的各项调优技术。先对语句实际运行的性能统计数据进行了深度分析,介绍各项统计数据是由什么操作导致的以及如何统计。然后介绍如何对sql语句进行优化以获得稳定、高效的性能。最后,依据对sql优化及调优技术的分析,介绍如何快速优化sql的思路。 《oracle 高性能sql引擎剖析:sql优化与调优机制详解》内容丰富且深入,破解了oracle技术的很多秘密,适合oracle数据库管理员、应用开发人员参考。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧