合 update修改为merge(max+decode)优化
记录日期: 2014-07-30 14:25:27
------------- 优化方法: 减少大表扫描次数采用max+decode方式
原sql语句:
UPDATE RKO_ACCT_STATUS A SET RMB_PAYMENT = (SELECT NVL(SUM(POSTING_AMT), 0) FROM RKOT_ACCT_PMT_PRIOR B WHERE B.ACCT = A.ACCT AND ORG = '242' AND POSTING_DATE BETWEEN A.PRIOR_BILLING_DATE + 1 AND ADD_MONTHS(A.PRIOR_BILLING_DATE, 1) AND TXN_DATE <= (SELECT CASE WHEN USER_DATE_10=0 THEN NULL ELSE TO_DATE(USER_DATE_10, 'yyyyddd') END FROM RKOH_HAPS_AMBS_KD WHERE ACCT = A.ACCT AND ORG = 242 AND BATCH_DATE = TO_CHAR(LAST_DAY(A.PRIOR_BILLING_DATE),'yyyymmdd')) + 0.99999), USD_PAYMENT = (SELECT NVL(SUM(POSTING_AMT), 0) FROM RKOT_ACCT_PMT_PRIOR B WHERE B.ACCT = A.ACCT AND ORG = '241' AND POSTING_DATE BETWEEN A.PRIOR_BILLING_DATE + 1 AND ADD_MONTHS(A.PRIOR_BILLING_DATE, 1) AND TXN_DATE <= (SELECT CASE WHEN USER_DATE_10=0 THEN NULL ELSE TO_DATE(USER_DATE_10, 'yyyyddd') END FROM RKOH_HAPS_AMBS_KD WHERE ACCT = A.ACCT AND ORG = 241 AND BATCH_DATE = TO_CHAR(LAST_DAY(A.PRIOR_BILLING_DATE),'yyyymmdd')) + 0.99999) WHERE TO_CHAR(A.PRIOR_BILLING_DATE, 'yyyymm') = :B1;
格式化一下:
UPDATE RKO_ACCT_STATUS A
SET RMB_PAYMENT =
(SELECT NVL(SUM(POSTING_AMT),
0)
FROM RKOT_ACCT_PMT_PRIOR B
WHERE B.ACCT = A.ACCT
AND ORG = '242'
AND POSTING_DATE BETWEEN A.PRIOR_BILLING_DATE + 1 AND
ADD_MONTHS(A.PRIOR_BILLING_DATE,
1)
AND TXN_DATE <=
(SELECT CASE
WHEN USER_DATE_10 = 0 THEN
NULL
ELSE
TO_DATE(USER_DATE_10,
'yyyyddd')
END
FROM RKOH_HAPS_AMBS_KD
WHERE ACCT = A.ACCT
AND ORG = 242
AND BATCH_DATE = TO_CHAR(LAST_DAY(A.PRIOR_BILLING_DATE),
'yyyymmdd')) + 0.99999),
USD_PAYMENT =
(SELECT NVL(SUM(POSTING_AMT),
0)
FROM RKOT_ACCT_PMT_PRIOR B
WHERE B.ACCT = A.ACCT
AND ORG = '241'
AND POSTING_DATE BETWEEN A.PRIOR_BILLING_DATE + 1 AND
ADD_MONTHS(A.PRIOR_BILLING_DATE,
1)
AND TXN_DATE <=
(SELECT CASE
WHEN USER_DATE_10 = 0 THEN
NULL
ELSE
TO_DATE(USER_DATE_10,
'yyyyddd')
END
FROM RKOH_HAPS_AMBS_KD
WHERE ACCT = A.ACCT
AND ORG = 241
AND BATCH_DATE = TO_CHAR(LAST_DAY(A.PRIOR_BILLING_DATE),