改进oracle存储过程中的查询或逻辑?

时间:2014-09-05 21:59:57

标签: stored-procedures relational-database plsqldeveloper

我有3张表如下:

CUSTOMER
CIF   SUMOFALLACCOUNTBALACE
A1    6000
A2    2000
A3    7000

ACCOUNT
ACCOUNTNUMBER  ACCOUNTBALANCE
B1             1000   
B2             2000
B3             3000
B4             4000
B5             5000

RELATION
CIF  ACCOUNTNUMBER
A1   B1
A1   B5
A2   B2
A3   B3
A3   B4

我需要使用SUMOFALLACCOUNTBALACE表更新相应CUSTOMER的所有ACCOUNTNUMBERCIF表中的RELATION

我为1乘1 CIF构建的示例查询是: -

UPDATE CUSTOMER
SET SUMOFALLACCOUNTBALACE =
  (SELECT SUM(ACCOUNTBALANCE)
   FROM ACCOUNT
   WHERE ACCOUNTNUMBER IN
     (SELECT ACCOUNTNUMBER
      FROM RELATION
      WHERE CIF IN 
        (SELECT CIF
         FROM CUSTOMER
         WHERE CIF = 'A1')))
WHERE CIF = 'A1'

这给了我正确的结果但是在大数据时需要时间,我也需要在oracle过程中使用循环将CIF 1传递给它。

有人可以建议一个更好的方法吗?

先谢谢, Gopal Arora

1 个答案:

答案 0 :(得分:0)

您可以执行一个语句,一次更新所有SUMOFACCOUNTBALANCE

UPDATE CUSTOMER C
SET SUMOFALLACCOUNTBALACE =
  (SELECT SUM(A.ACCOUNTBALANCE)
   FROM RELATION R
        INNER JOIN ACCOUNT A
          ON (A.ACCOUNTNUMBER = R.ACCOUNTNUMBER)
   WHERE R.CIF = C.CIF)

但是,一般情况下,由于在形成计算的元素发生变化时计算结果不能保持最新的危险,因此不应存储计算结果。如果您没有CUSTOMER.SUMOFALLACCOUNTBALACE列,而不是在需要时根据基础数据计算它,那会更好。通过这种方式,您可以确保其值始终正确。

SELECT C.CIF
      ,SUM(A.ACCOUNTBALANCE) SUMOFALLACCOUNTBALACE
FROM CUSTOMER C
     LEFT OUTER JOIN RELATION R
       ON (R.CIF = C.CIF)
     LEFT OUTER JOIN ACCOUNT A
       ON (A.ACCOUNTNUMBER = R.ACCOUNTNUMBER)