使用MERGE INTO刪除記錄

MERGE INTO刪除記錄

在itpub上看了一帖子http://www.itpub.net/thread-1570535-1-1.html


需求:

SQL> SELECT * FROM tmp;

        ID PROJECT              PDATE                 CNT
---------- -------------------- -------------- ----------
         1 pro1                 06-2月 -12              2
         1 pro1                 07-2月 -12             10
         1 pro1                 08-2月 -12             10
         1 pro1                 09-2月 -12             20
         2 pro2                 10-2月 -12              5
         2 pro2                 11-2月 -12              5

已選擇6行。
以tmp表查詢結果爲例,刪除id與project相同的其它記錄,只保存最早的那條數據 ,並且改變最早的那條記錄的數量爲id與project相同的所有記錄的cnt之和,比如id=1,project='pro1'的所有記錄cnt之和42。


SQL> SELECT * FROM tmp;

        ID PROJECT              PDATE                 CNT
---------- -------------------- -------------- ----------
         1 pro1                 06-2月 -12              2
         1 pro1                 07-2月 -12             10
         1 pro1                 08-2月 -12             10
         1 pro1                 09-2月 -12             20
         2 pro2                 10-2月 -12              5
         2 pro2                 11-2月 -12              5

已選擇6行。

SQL> --以id,project分區並求和
SQL> SELECT ROWID rid, id,project,pdate,cnt,
  2         SUM (cnt) OVER (PARTITION BY id, project) sum_qty from tmp  ;

RID                        ID PROJECT              PDATE                 CNT    SUM_QTY
------------------ ---------- -------------------- -------------- ---------- ----------
AAANCZAAEAAAAH9AAG          1 pro1                 06-2月 -12              2         42
AAANCZAAEAAAAH9AAH          1 pro1                 07-2月 -12             10         42
AAANCZAAEAAAAH9AAI          1 pro1                 08-2月 -12             10         42
AAANCZAAEAAAAH9AAJ          1 pro1                 09-2月 -12             20         42
AAANCZAAEAAAAH9AAK          2 pro2                 10-2月 -12              5         10
AAANCZAAEAAAAH9AAL          2 pro2                 11-2月 -12              5         10

已選擇6行。

SQL> --以id,project分區並求和,並 使用DENSE_RANK爲記錄編號
SQL> SELECT ROWID rid,project,pdate,cnt,
  2         SUM (cnt) OVER (PARTITION BY id, project) sum_qty,
  3         DENSE_RANK () OVER (PARTITION BY id, project ORDER BY pdate ) rn
  4    FROM tmp;

RID                PROJECT              PDATE                 CNT    SUM_QTY         RN
------------------ -------------------- -------------- ---------- ---------- ----------
AAANCZAAEAAAAH9AAG pro1                 06-2月 -12              2         42          1
AAANCZAAEAAAAH9AAH pro1                 07-2月 -12             10         42          2
AAANCZAAEAAAAH9AAI pro1                 08-2月 -12             10         42          3
AAANCZAAEAAAAH9AAJ pro1                 09-2月 -12             20         42          4
AAANCZAAEAAAAH9AAK pro2                 10-2月 -12              5         10          1
AAANCZAAEAAAAH9AAL pro2                 11-2月 -12              5         10          2

已選擇6行。

SQL> --使用merge into 更新並刪除相關記錄
SQL> MERGE INTO tmp t1
  2       USING (SELECT ROWID rid,
  3                     project,
  4                     pdate,
  5                     cnt,
  6                     SUM (cnt) OVER (PARTITION BY id, project) sum_qty,
  7                     DENSE_RANK ()
  8                        OVER (PARTITION BY id, project ORDER BY pdate)
  9                        rn
 10                FROM tmp) t2
 11          ON (t1.ROWID = t2.rid)
 12  WHEN MATCHED
 13  THEN
 14     UPDATE SET t1.cnt = sum_qty
 15     DELETE
 16             WHERE (t2.rn <> 1);

6 行已合併。

--顯示了正確的結果
SQL> SELECT * FROM tmp;

        ID PROJECT              PDATE                 CNT
---------- -------------------- -------------- ----------
         1 pro1                 06-2月 -12             42
         2 pro2                 10-2月 -12             10

最後的結果應該是正確的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章