我有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
的所有ACCOUNTNUMBER
个CIF
表中的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
答案 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)