Oracle 通过一长串的子查询出来的值要用作计算怎么办?

Oracle 通过一长串的子查询出来的值要用作计算怎么办?

业务场景:

公司需要有一张关于校验账户明细的报表,但是余额表的期初余额字段没有维护,甚至会因为软件异常停止,导致期初余额字段为空,那么该如何获取正确的期初余额值呢?

先来一段取最近日期的sql🤠

-- &date 为需要改变的日期格式
select 
	col_name 
from table 
	where abs(col_name-to_date(&date))=(select min(abs(col_name-to_date(&date)) from table);

具体思路查询上一天或离上一天最近一天的余额

   select c.AVAILABLE_BALANCE from AIMS_ACCOUNT_BALANCE c 
     	where c.BALANCE_DATE = (select max(b.BALANCE_DATE) from AIMS_ACCOUNT_BALANCE b
	where b.BALANCE_DATE < a.BALANCE_DATE

问题来了 🙇

这个数据我要用于计算余额,用来判断是否明细异常,用来…😢

思路:将查询结果作为一张表关联表查询,用别名来做逻辑业务

select ..... from 表 关联表
left join .....
.
.
left join (
    select
        (select c.AVAILABLE_BALANCE from AIMS_ACCOUNT_BALANCE c
        where c.BALANCE_DATE =
              (
              select max(b.BALANCE_DATE) from AIMS_ACCOUNT_BALANCE b
                where b.BALANCE_DATE < a.BALANCE_DATE and b.ACCOUNTNO = a.ACCOUNTNO
        ) and c.ACCOUNTNO = a.ACCOUNTNO) as "preAmount",
        a.BALANCE_DATE as "balanceDate",
        a.ACCOUNTNO as "accountNo"
    from AIMS_ACCOUNT_BALANCE a
   ) tab3 on tab3."accountNo" = 关联表.ACCOUNTNO and 关联表.BALANCE_DATE = tab3."balanceDate"

这样我们就可以在主查询里面可以用tab3."preAmount"进行逻辑计算。

包一段select是因为需要用到该数字进行计算,那么我们就可可以将其作为表关联起来,避免在主select查询使用子查询进行计算,从而导致性能降低。

如果在数据库压力高的情况下我们可以考虑,因为执行一条sql数据库访问次数只要一次,但数据库压力不大,数据量大的情况下,用sql做逻辑处理,往往会使得这条sql冗余,在数据量大的情况下还是不可取的,会使得查询效率非常慢,将逻辑放在代码层,这样会使得逻辑更加的清晰并且sql执行效率快,但这样增加了数据库的访问量。如果你能用一个sql写出的查询效率不慢那就是最好的。

©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页