现在的位置: 首页 > 综合 > 正文

使用MERGE INTO删除记录

2013年08月01日 ⁄ 综合 ⁄ 共 1934字 ⁄ 字号 评论关闭

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

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

抱歉!评论已关闭.