您的位置:首页 > 其它

使用MERGE INTO删除记录

2012-02-08 18:44 316 查看
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


最后的结果应该是正确的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: