oracle merge into 满足或不满足条件,是否可以执行两条语句?

wangsaisoon 2018-10-29 04:52:35
如下,如何执行两条修改或插入语句?

merge into game t1 using
(select c_id, c_name from c_table) t2
on (t1.g_id = t2.c_id)

when matched then
update set t1.g_id = t2.c_id, t1.g_name = t2.g_name
where t1.g_id != '1001';

update set t1.g_id = t2.c_id, t1.g_name = t2.g_name
where t1.g_id = '1001';

when not matched then

insert(t1.g_id, t1.g_name) values (t2.c_id, t2.c_name)
where t1.g_id != '1001';

insert(t1.g_id, t1.g_name) values (t2.c_id, t2.c_name)
where t1.g_id = '1001';
...全文
1359 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangsaisoon 2018-10-30
  • 打赏
  • 举报
回复
引用 7 楼 wmxcn2000 的回复:
可以,放在一个子查询中就可以了。

应该怎么写?
wangsaisoon 2018-10-30
  • 打赏
  • 举报
回复
引用 13 楼 wmxcn2000 的回复:
你是什么条件,就写什么条件就可以了。

有点跑题了,满足条件后,同时执行两个update/insert语句,两个语句是完全相反的。
卖水果的net 2018-10-30
  • 打赏
  • 举报
回复
你是什么条件,就写什么条件就可以了。
wangsaisoon 2018-10-30
  • 打赏
  • 举报
回复
引用 11 楼 wmxcn2000 的回复:
不用标量子查询也可以
直接把条件写进来

  update set t1.g_id = t2.c_id, 
             t1.g_name =case when g_id != 1001 && g_id != 1002 && g_id != 1003 && g_id != 1004 then t2.c_name else  t1.g_name end


这么写的话,g_id != 1001 && g_id != 1002 && g_id != 1003 && g_id != 1004条件的修改了,那g_id = 1001 || g_id = 1002 || g_id = 1003 || g_id = 1004的条件,如何修改?
卖水果的net 2018-10-30
  • 打赏
  • 举报
回复
不用标量子查询也可以 直接把条件写进来   update set t1.g_id = t2.c_id,               t1.g_name =case when g_id != 1001 && g_id != 1002 && g_id != 1003 && g_id != 1004 then t2.c_name else  t1.g_name end
wangsaisoon 2018-10-30
  • 打赏
  • 举报
回复
引用 9 楼 wmxcn2000 的回复:
把你的条件写出来,我好告诉你怎么写。

还是建议你先了解一下 “标量子查询” 这个概念。 对你这个需求有用。

g_id != 1001 && g_id != 1002 && g_id != 1003 && g_id != 1004等等,,四五十个条件这样的
卖水果的net 2018-10-30
  • 打赏
  • 举报
回复
把你的条件写出来,我好告诉你怎么写。 还是建议你先了解一下 “标量子查询” 这个概念。 对你这个需求有用。
卖水果的net 2018-10-29
  • 打赏
  • 举报
回复
可以,放在一个子查询中就可以了。
wangsaisoon 2018-10-29
  • 打赏
  • 举报
回复
引用 5 楼 wmxcn2000 的回复:

-- 试试这个

merge into t1
using t2 on (t1.g_con = t2.c_con)
when matched then
update set t1.g_id = t2.c_id,
t1.g_name = decode(t2.g_id, '1001', t2.c_name, t1.g_name)
when not matched then
insert (g_id, g_name)
values(t2.g_id, decode(t2.g_id, '1001', t2.c_name, default);



g_id != 1001,g_id = 1001这种条件有好多,四五十个,这么写会不会有点多,有没有那种in或not in的
卖水果的net 2018-10-29
  • 打赏
  • 举报
回复

--  试试这个 

merge into t1
using t2 on (t1.g_con = t2.c_con)
when matched then
  update set t1.g_id = t2.c_id, 
             t1.g_name = decode(t2.g_id, '1001', t2.c_name, t1.g_name)
when not matched then 
  insert (g_id, g_name) 
  values(t2.g_id, decode(t2.g_id, '1001', t2.c_name, default);
  
wangsaisoon 2018-10-29
  • 打赏
  • 举报
回复
引用 3 楼 wmxcn2000 的回复:
举个例子吧,用 excel 表简单的画一下。



如上表,条件f0(t1.g_con = t2.c_con)
条件f0满足,且g_id = 1001时,update set t1.g_id = t2.c_id, t1.g_name = t2.c_name;
条件f0满足,但g_id != 1001时,update set t1.g_id = t2.c_id;

条件f0不满足,但g_id = 1001时,insert(t1.g_id, t1.g_name) values(t2.c_id, t2.c_name);
条件f0不满足,且g_id != 1001时,insert(t1.g_id) values(t2.c_id);

大概,就这么个意思。
卖水果的net 2018-10-29
  • 打赏
  • 举报
回复
举个例子吧,用 excel 表简单的画一下。
wangsaisoon 2018-10-29
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
不可以。

在 matched 和 not matched 后,只能写一个语句,不能写两个。

insert 也只能写成 values 形式,不能写成 select 。

楼主不妨说一下需求,看看有没有办法帮你实现。


前提是某个固定条件(f0),
当满足f0且满足另一个条件(f1)执行一条修改语句;
当满足f0但不满足另一个条件(f1)执行另一条修改语句;

当不满足f0但满足另一个条件(f1)执行一条插入语句;
当不满足f0且不满足另一个条件(f1)执行一条插入语句;

就像我提问的那个sql语句一样。

卖水果的net 2018-10-29
  • 打赏
  • 举报
回复
不可以。 在 matched 和 not matched 后,只能写一个语句,不能写两个。 insert 也只能写成 values 形式,不能写成 select 。 楼主不妨说一下需求,看看有没有办法帮你实现。

17,082

社区成员

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

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