2014-09-05 73 views
0

我有3个表如下:改进oracle存储过程中的查询或逻辑?

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 

我需要使用RELATIONCUSTOMER表中的所有可用ACCOUNTNUMBER小号各CIF S的的更新SUMOFALLACCOUNTBALACE

示例查询我1 CIF 1内置的是: -

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' 

这是给我正确的结果,但它走的时候大量的数据,我也需要通过1甲骨文通过CIF 1使用循环的过程。

任何人都可以请建议一个更好的方法来做到这一点?

由于事先 戈帕尔·阿罗拉

回答

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)