SQL优化--根据指定条件查最新的记录

本文介绍了一种改进ERP系统中流水账查询的方法,通过将原有的SQL语句进行重构,使用窗口函数代替聚合函数,提高了查询效率和代码可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因业务原因,ERP系统里面的一些流水账查询经常是一个大麻烦,或者说让大家都头痛的问题。最近因之前的麻烦没处理好,再次进入调整的步伐。

还好,之前已经让开发通过业务逻辑来把SQL已经调的很简单了。现在我就只需要从写SQL技巧方面改良一下就差不多了。

原SQL:

 select   b.SEQNO,FK,LINEID,LASTMODIFYTIME,CREATETIME,b.BRANCHID,b.CUSTOMERID,b.BILLINGDATE, BILLID,ABSTRACT,AMTOFDEBITSIDE,AMTOFCREDITSIDE,
                 BALANCE,PREPAIDBAL,CARRYOVERNO,DELETEFLAG,NOTE,VERSION,p_billingDate  from tb_gos_account_o_custrun b 
               /*    inner join          (select max(SEQNO) SEQNO,branchid,customerid  
            From tb_gos_account_o_custrun a where a.billingdate <= p_billingDate
                                                  and a.branchid=p_branchid
                                          group by branchid,customerid)  a on a.seqno = b.seqno and a.customerid = b.customerid and a.branchid=b.branchid
                  */                        
                 where b.branchid=p_branchid and (seqno,branchid,customerid) in 
         (select max(SEQNO) SEQNO,branchid,customerid  
            From tb_gos_account_o_custrun a where a.billingdate <= p_billingDate
                                                  and a.branchid=p_branchid
                                          group by branchid,customerid) 
                                           ;

上面的语句就是从join 换到in ,从in 换到JOIN,换汤不换药,用起来差别没什么区别。两个传入参数p_branchid、p_billingDate。

改后的SQL:

select * from (
select   b.SEQNO,FK,LINEID,LASTMODIFYTIME,CREATETIME,b.BRANCHID,b.CUSTOMERID,b.BILLINGDATE,
 BILLID,ABSTRACT,AMTOFDEBITSIDE,AMTOFCREDITSIDE,
    BALANCE,PREPAIDBAL,CARRYOVERNO,DELETEFLAG,NOTE,VERSION,p_billingDate,
   row_number() OVER(PARTITION BY branchid,customerid ORDER BY seqno desc)  as row_flg    
                  from tb_gos_account_o_custrun b
                  where B.branchid=p_branchid and B.billingdate<=p_billingDate
                  ) temp
                  where temp.row_flg=1 

改后的SQL从执行计划层面较原来的要简单很多。避免了表的重复扫。使用了窗口函数代替原来的聚合函数。可读性提高、代码精简。后面的查询条件基本上不能过滤多少数据,而此流水账表里面的数据是比较大的。所以目前用第二种代替了前面的一种。从业务逻辑上,要实现的是,在流水账目录中查询某公司所有客户最新的一笔流水账。

改写后,比对了2种查询性能速度的差别。。。着实第2种赞啊~~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值