Merge中能写流程控制语句吗?例如 if else,case when这种语句?

etl2007 2009-03-21 04:31:35
下面是我实际的问题
比较长,希望能有 大虾看完
反正就是要用一张表去更新另外一张表,之前学习了一下merge
如果 Merge中能写流程控制语句吗?例如 if else,case when这种语句?
这样就比较好了

终端更换信令月统计 规则   终端更换信令知识库
统计月份 月汇总 服务号码
服务号码
当月isdn 当前ISDN
本月isdn最早存在日期 上一个ISDN
上一个ISDN更新日期
上一个ISDN更新时长
最近一次ISDN更新日期
最近一次ISDN已经使用时长
ISDN更新次数
平均ISDN更新时长

上面有两个表,一个是 终端更换信令月统计(月汇总),号码就是主键,即一个号码只有一条记录
上面有两个表,一个是 终端更换信令知识库(也是每月更新一次),也是一个号码只有一条记录

现在需要通过终端更换信令月统计 去更新 终端更换信令知识库

我说一下大致的处理逻辑 如果 终端更换信令月统计 表中 服务号码(即手机号) 在 终端更换信令知识库 表中 不存在
那么实际是要在终端更换信令知识库 表 新增一条记录,先不考虑这个
关键是考虑 如果 终端更换信令月统计 表中 服务号码(即手机号) 在 终端更换信令知识库 表中 存在
那么实际是要在终端更换信令知识库 表更新一条记录

例如假设 123 这个号码在两个表中都存在了,假设现在是要统计3月份数据

如果在 终端更换信令月统计 表的当月isdn和 终端更换信令知识库 表中的当前isdn一致,
即都是 aaa
那么就不更新终端更换信令知识库 表中的 当前isdn
需要更新的是终端更换信令知识库 表中的 当前最近一次ISDN已经使用时长,
即用先前当前最近一次ISDN已经使用时长+当月的使用天数,什么意思呢,假设现在
终端更换信令知识库 表中的 当前最近一次ISDN已经使用时长 是182 天,而3月份是31
天,那么 当前最近一次ISDN已经使用时长 这个字段新的值是 182+31 =213 天。

其他字段都不用更新

如果在 终端更换信令月统计 表的当月isdn和 终端更换信令知识库 表中的当前isdn不一致,
例如 在 终端更换信令月统计 表的当月isdn 是aaa
在终端更换信令知识库 表中的当前isdn是bbb,
那么就要更新终端更换信令知识库 表中的 当前isdn
即将
上一个isdn更新为 bbb.
上一个ISDN更新日期 需要将最近一次ISDN更新日期这个值 拷贝过来,因为现在bbb已经成为了上一个isdn
同理上一个ISDN更新时长,也是指bbb这个isdn的更新时长,这个值要靠终端更换信令月统计 表的本月isdn最早存在日期 去计算 。即aaa是3月21日更新,那么3月1日到
3月20日还是bbb这个isdn
那么计算公司就是 最近一次ISDN已经使用时长+(本月isdn最早存在日期-当月第一天)
假设bbb已经使用了156天,那么就是 156+21-1=176 天
当前isdn更新为 aaa
最近一次ISDN更新日期 就是终端更换信令月统计表中的本月isdn最早存在日期
最近一次ISDN已经使用时长 就是 当前isdn的使用时长,即aaa的使用时长
那么就是当月最后一天减去本月isdn最早存在日期
例如3月最后一天是3月31日,而isdn最早存在日期是 3月21日
那么最近一次ISDN已经使用时长 就是 31-21 =10天

Isdn更新次数,因为发生了isdn更新,那么更新次数就要加一次
逻辑就是 Isdn更新次数= Isdn更新次数+1
如果原先的 Isdn更新次数是4,那么现在就是4+1=5

平均ISDN更新时长的计算规则是
上个isdn更新时长算60%,原有的平均isdn更新时长算40%,第一次时就直接拷贝上个isdn的更新时长,只有isdn发生变化了才更新该值

假设现在原有 平均ISDN更新时长 是200 天,而上个isdn,bbb是176 天
那么最新平均ISDN更新时长 =200*40%+176*60%

不知用merge是否能实现这么样的逻辑
如果不能,那估计就只能用游标了
不知是否还有什么更高效率的做法也ok 啊
请指教啊




...全文
623 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
强哥83 2012-03-01
  • 打赏
  • 举报
回复
update table set field= case when a.col1=b.col1 then a.col1 else b.col1 end
etl2007 2009-03-24
  • 打赏
  • 举报
回复
没有大虾愿意指教吗?
http://topic.csdn.net/u/20090319/10/DBB52E09-232F-4FF2-A67E-98CF0AFA6CCF.html
etl2007 2009-03-23
  • 打赏
  • 举报
回复
MERGE agg_table a
USING month_table m
ON (a.user_name = m.user_name)
WHEN MATCHED THEN
UPDATE SET
last_region = m.region,
arrived_region_count = arrived_region_count + 1
WHEN NOT MATCHED THEN
INSERT(user_name, least_region, arrived_region_count)
VALUES(m.user_name, m.region, 1);

我现在 想根据不同的流程控制来做更新
例如

MERGE agg_table a
USING month_table m
ON (a.user_name = m.user_name)
WHEN MATCHED THEN
if () then

UPDATE SET
last_region = m.region,
arrived_region_count = arrived_region_count + 1

else if () then
update ...

else if () then
upate ...

end if
WHEN NOT MATCHED THEN
INSERT(user_name, least_region, arrived_region_count)
VALUES(m.user_name, m.region, 1);

请问这样可以吗?大虾指教啊
etl2007 2009-03-23
  • 打赏
  • 举报
回复
哦,那以从前的例子为例把
有两张表

table1
field_1 field_2
1 AA
2 BB
3 CC
4 gg

table2
field_1 field_3
1 dd
2 rr

table1的field_1是住键
table2的field_1是外键依赖table1的field_1

现在希望用table1来更新 table2
如果table2中field_1在table1中存在,那么 就用field_2更新field_3
如果没有就插入一条table1的field_1和field_2到field_1和field_3



请问有什么好办法 啊?


问题点数:20 回复次数:3 显示所有回复显示星级回复显示楼主回复 修改 删除 举报 引用 回复


加为好友
发送私信
在线聊天
wffffc

等级:
可用分等级:掌柜
总技术分:5700
总技术分排名:4052

发表于:2009-03-03 21:03:231楼 得分:5
MERGE INTO table2 t2
USING table1 t1
ON (t2.field_1= t1.field_1)
WHEN MATCHED THEN
UPDATE
SET t2.field_2= t1.field_3;


修改 删除 举报 引用 回复

加为好友
发送私信
在线聊天
etl2007
etl2007
等级:
可用分等级:长工
总技术分:0
总技术分排名:338017

发表于:2009-03-04 19:00:382楼 得分:0
现在问题恐怕没有那么简单了
现在情况是这样的

我现在的表是这样的

每个月统计一次每个雇员去了哪些国家
user_name region
tom india
jerry usa
mike england
marry holland

但是有一张汇总表

user_name least_region arrived_region_count
雇员名 最新去的国家 已经到过多少个国家
tom india 4
jerry usa 6
mike england 10
marry holland 11


已经到过多少个国家
的计算规则是 如果上个月 这个表的数据还是

user_name least_region arrived_region_count
雇员名 最新去的国家 已经到过多少个国家
tom greece 3
jerry sweden 4
mike switchland 9
marry germany 10

例如tom上个月还只到了3个国家,那么这个月需要就是 3+1,因为tom这个月又去了一个新的国家,印度。

这个就不能用merge了吧
请问又什么 快速高效的sql 实现呢?




修改 删除 举报 引用 回复

加为好友
发送私信
在线聊天
zcs_1
生生不息
等级:
可用分等级:富农
总技术分:6403
总技术分排名:3892

发表于:2009-03-04 20:06:313楼 得分:15
也可以用merge,根据每个月雇员去的国家表来更新汇总表

MERGE agg_table a
USING month_table m
ON (a.user_name = m.user_name)
WHEN MATCHED THEN
UPDATE SET
last_region = m.region,
arrived_region_count = arrived_region_count + 1
WHEN NOT MATCHED THEN
INSERT(user_name, least_region, arrived_region_count)
VALUES(m.user_name, m.region, 1);

jdsnhan 2009-03-21
  • 打赏
  • 举报
回复
看的太累
举数据例子吧

17,086

社区成员

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

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