使用MERGE INTO删除记录
2012-02-08 18:44
316 查看
MERGE INTO删除记录
在itpub上看了一帖子http://www.itpub.net/thread-1570535-1-1.html
需求:
最后的结果应该是正确的。
在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
最后的结果应该是正确的。
相关文章推荐
- 使用游标的方式删除表中相同的记录,并只留下其中一条
- myapps iscript脚本iscript使用记录,主子表一对多插入数据,删除数据、值转换
- GridView使用技巧之:新增记录、GridView内数据验证、删除信息提示等
- 使用OUTPUT从句从SQL Server表删除和归档大量记录
- 使用SQL语句对重复记录查询、统计重复次数、删除重复数据
- SQL语句使用Left Outer join代替In删除多条记录
- myeclipse 删除不再使用的工作空间记录
- Table 组件使用指南之三:一次删除Table多行记录
- 使用php设置cookies时出现无法删除cookies的情况记录
- 远程桌面使用痕迹清理【完全删除远程桌面连接历史记录】
- DB2 insert or update 解决方案(使用merge into 解决一条记录,或者多表关系问题)
- GridView使用技巧之:新增记录、GridView内数据验证、删除信息提示等
- SqlServer2005中使用row_number()在一个查询中删除重复记录
- 对重复的记录使用SQL进行查询和删除等操作
- 使用一条SQL语句删除表中重复记录
- Dynamic CRM 2016使用WEB API删除记录(js)
- Linux Oracle下sqlplus无法使用命令退格删除和历史记录的解决方法(使用rlwrap)
- Oracle merge into 使用记录
- Django 使用 MySQL 存储时间中遇到的问题(在数据库中记录插入时间、更新时间、删除时间)
- 如何使用CommandArgument属性根据id删除记录