使用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

最后的结果应该是正确的。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值