查看: 4761|回复: 13

【讨论】能否用一个语句完成insert+update+delete

[复制链接]
论坛徽章:
1
优秀写手
日期:2014-07-12 06:00:13
发表于 2014-9-18 22:22 | 显示全部楼层 |阅读模式
类似merge into,比如将A表merge到B表,比较某id字段,很容易用一个merge into实现update+insert的效果。但能否用一个语句来实现:
when not matched --> insert
when matched --查看一个字段,若是U,就update,是D就将目标表对应记录删掉。

这样的操作呢?
谢谢。

招聘 : 系统分析师
论坛徽章:
483
马上有钱
日期:2014-02-19 11:55:14itpub13周年纪念徽章
日期:2014-09-29 01:14:14itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25马上有对象
日期:2014-10-12 11:58:40马上有车
日期:2014-11-16 17:11:29慢羊羊
日期:2015-02-09 17:04:38沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31ITPUB年度最佳版主
日期:2015-03-18 15:48:48
发表于 2014-9-18 22:24 | 显示全部楼层
when matched的时候是可以删除记录的
但是没法既删除又更新

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2014-9-18 22:27 | 显示全部楼层
lastwinner 发表于 2014-9-18 22:24
when matched的时候是可以删除记录的
但是没法既删除又更新

可以啊,但是必须是更新完了之后,选择删除delete where...

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2014-9-18 22:29 | 显示全部楼层
--10g新特性,merge操作之后,只有匹配的update操作才可以,用delete where子句删除目标表中满足条件的行。要注意,必须是在匹配的前提条件下,先更新原始表后,删除满足条件的行,也就是对更新的源表行调用删除条件删除,删除条件可以是目标表和匹配表,因为是在关联前提下,还有单个insert/update功能。


drop table t1;
drop table t2;
create table t1(id number,name varchar2(10));
create table t2(id number,name varchar2(10));
insert into t1 values(1,'a');
insert into t1 values(2,'b');
insert into t1 values(3,'c');
insert into t1 values(5,'a');
insert into t2 values(1,'x');
insert into t2 values(2,'y');
insert into t2 values(4,'z');
insert into t2 values(6,'a');
commit;

merge into t2  
     using t1 on (t1.id=t2.id)
   when MATCHED then
        update set t2.name=t1.name   
        delete where (t2.name='a');
        

merge into t2  
     using t1 on (t1.id=t2.id)
   when MATCHED then
        update set t2.name=t1.name   
        delete where (t1.ID=1);

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-07-12 06:00:13
 楼主| 发表于 2014-9-18 22:32 | 显示全部楼层
不能先delete再update吗?能delete了就不用update一下了……对吧。

使用道具 举报

回复
论坛徽章:
536
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2014-9-18 22:33 | 显示全部楼层
先UPDATE再删除,这个比较愚蠢。

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2014-9-18 22:43 | 显示全部楼层
newkid 发表于 2014-9-18 22:33
先UPDATE再删除,这个比较愚蠢。

newkid哥哥让oracle改了吧

使用道具 举报

回复
论坛徽章:
536
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2014-9-18 23:03 | 显示全部楼层
dingjun123 发表于 2014-9-18 22:43
newkid哥哥让oracle改了吧

我要有那能耐还在这混?

使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
483
马上有钱
日期:2014-02-19 11:55:14itpub13周年纪念徽章
日期:2014-09-29 01:14:14itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25马上有对象
日期:2014-10-12 11:58:40马上有车
日期:2014-11-16 17:11:29慢羊羊
日期:2015-02-09 17:04:38沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31ITPUB年度最佳版主
日期:2015-03-18 15:48:48
发表于 2014-9-19 00:02 | 显示全部楼层
dingjun123 发表于 2014-9-18 22:27
可以啊,但是必须是更新完了之后,选择删除delete where...

哦,对,忘了delete where
在楼主这特定的条件下,是可以做到的

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-07-12 06:00:13
 楼主| 发表于 2014-9-19 10:12 | 显示全部楼层
所以我还是用游标吧……

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表