Oracle 9i 中merge的问题

icerainy 2009-11-04 04:28:48
求问:9i中只想更新不想插入怎么写?
MERGE INTO user p
USING TEMP tp
ON (p.TYPE = tp.TYPE)
WHEN MATCHED THEN
UPDATE SET p.SYS_NAME= tp.SYS_NAME
WHEN NOT MATCHED THEN
INSERT ()
VALUES ()
这样写肯定不对
去掉WHEN NOT MATCHED THEN 也不对,
哪位大哥有好的办法?
这个问题起源:我想插入数据,如果
1、TYPE 不重复则插入
2、TYPE 重复的 还要看 另一个字段 “op” 如果op有值 则不进行操作
3、如果op没值则进行更新

如果是10g就简单了直接 where 就行了 可怜的是客户的是9i 请高手赐教
...全文
156 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
超叔csdn 2009-11-05
  • 打赏
  • 举报
回复
不好意思,没看清楚你是9I
超叔csdn 2009-11-05
  • 打赏
  • 举报
回复
这个问题起源:我想插入数据,如果
1、TYPE 不重复则插入
2、TYPE 重复的 还要看 另一个字段 “op” 如果op有值 则不进行操作
3、如果op没值则进行更新

貌似你的这3点只要加个where条件就OK了?
MERGE INTO user p
USING TEMP tp
ON (p.TYPE = tp.TYPE)
WHEN MATCHED THEN
UPDATE SET p.SYS_NAME= tp.SYS_NAME
where p.op is null
WHEN NOT MATCHED THEN
INSERT ()
VALUES ()
小灰狼W 2009-11-05
  • 打赏
  • 举报
回复
update p set (col1,col2,col3...col50)=(select col1,col2,col3...col50 from tp where...)
where exists(....);
icerainy 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wildwave 的回复:]
9i好像when matched和not matched部分都要写..
楼主可以不用merge into

update p set sys_name=(select sys_name from tp where type=p.type)
  where exists(select 1 from tp where type=p.type)
[/Quote]

好的 的确这样可以,或者写个存储过程也行
我现在考虑些效率问题,另外我上面举得只是一个例子,实际操作更新的是所有字段(>50个字段)如果每个字段都这么写的话,大数据的时候效率肯定很差,不过仍然是个这种的办法,我再等等看有没有更好的思路。
inthirties 2009-11-04
  • 打赏
  • 举报
回复
http://blog.csdn.net/inthirties/archive/2009/10/27/4731930.aspx
inthirties 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 icerainy 的回复:]
求问:9i中只想更新不想插入怎么写?
MERGE INTO user p
USING TEMP tp
ON (p.TYPE = tp.TYPE)
WHEN MATCHED THEN
  UPDATE SET p.SYS_NAME= tp.SYS_NAME
WHEN NOT MATCHED THEN
INSERT ()
VALUES ()
这样写肯定不对
去掉WHEN NOT MATCHED THEN  也不对,
哪位大哥有好的办法?
这个问题起源:我想插入数据,如果
1、TYPE 不重复则插入
2、TYPE 重复的 还要看 另一个字段 “op” 如果op有值 则不进行操作
3、如果op没值则进行更新

如果是10g就简单了直接 where 就行了 可怜的是客户的是9i 请高手赐教
[/Quote]

9i不支持单独的update和insert


小灰狼W 2009-11-04
  • 打赏
  • 举报
回复
3点需求看不明白..
小灰狼W 2009-11-04
  • 打赏
  • 举报
回复
9i好像when matched和not matched部分都要写..
楼主可以不用merge into

update p set sys_name=(select sys_name from tp where type=p.type)
where exists(select 1 from tp where type=p.type)
icerainy 2009-11-04
  • 打赏
  • 举报
回复
我现在只想 满足的时候更新 不满足的时候 不操作
这样也不能满足吗? 难道必须得插入吗?
icerainy 2009-11-04
  • 打赏
  • 举报
回复
我现在只想 满足的时候插入 不满足的时候 不操作
这样也不能满足吗? 难道必须得插入吗?
oraclemch 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 icerainy 的回复:]
求问:9i中只想更新不想插入怎么写?
MERGE INTO user p
USING TEMP tp
ON (p.TYPE = tp.TYPE)
WHEN MATCHED THEN
  UPDATE SET p.SYS_NAME= tp.SYS_NAME
WHEN NOT MATCHED THEN
INSERT ()
VALUES ()
这样写肯定不对
去掉WHEN NOT MATCHED THEN  也不对,
哪位大哥有好的办法?
这个问题起源:我想插入数据,如果
1、TYPE 不重复则插入
2、TYPE 重复的 还要看 另一个字段 “op” 如果op有值 则不进行操作
3、如果op没值则进行更新

如果是10g就简单了直接 where 就行了 可怜的是客户的是9i 请高手赐教
[/Quote]

merger的是A表有的不插入,没有的将B表的数据插入。

而你的则有那么多业务逻辑,完全超出了merger的应用范围啊。建议你写个存储过程来实现吧。单纯的merger into语句解决不了你的需求的。
Dave 2009-11-04
  • 打赏
  • 举报
回复
Oracle merge into 的用法详解实例

作用:merge into 解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表;

语法:

MERGE INTO [your table-name] [rename your table here]

USING ( [write your query here] )[rename your query-sql and using just like a table]

ON ([conditional expression here] AND [...]...)

WHEN MATHED THEN [here you can execute some update sql or something else ]

WHEN NOT MATHED THEN [execute something else here ! ]

-------实例-------


merge into a
using (select id,name from b ) c
on(a.id=c.id )
when matched then update set a.name=c.name
when not matched then insert (a.id,a.name) values (c.id,c.name);


作用:利用表 b 跟新表a ,条件是a.id=b.id,如果a表中没有该条件的数据就插入。

如果你的数据量很大,此sql效率非常高。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tianlesoftware/archive/2009/10/23/4714921.aspx

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧