2014-09-05 49 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)