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
最后的结果应该是正确的。