MERGE INTO 问题

fuyou001 2009-11-20 02:36:13

MERGE INTO games_data b
using (select sub_id, game_name, registe_date, rn
from (select sub_id,
game_name,
a.registe_date,
row_number() over(partition by game_name, sub_id, trunc(registe_date) order by sub_id, registe_date) as rn
from game_user_details a
where trunc(registe_date) = trunc(sysdate))
where rn = 1) c
on (trunc(b.DATE1) = trunc(c.registe_date))
WHEN MATCHED THEN
update set b.site_id = c.sub_id, b.date1 = c.registe_date
WHEN NOT MATCHED THEN
insert (site_id, date1) values (c.sub_id, c.registe_date)


上面报 b.DATE1 无效标识,可我games_data b表中明明就有date1这个字段

找了下MERGE INTO 也支持子查询,我找不出错误 出在哪
大家帮我看下
数据库 oracle 9i R2
...全文
187 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qdjnlmk 2009-11-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fuyou001 的回复:]
SQL code
MERGEINTO games_data b
using (select sub_id, game_name, registe_date, rnfrom (select sub_id,
game_name,
a.registe_date,
row_number()over(partitionby game_name, sub_id, trunc(registe_date)orderby sub_id, registe_date)as rnfrom game_user_details awhere trunc(registe_date)= trunc(sysdate))where rn=1) con1=1WHEN MATCHEDTHENupdateset b.site_id= c.sub_id, b.date1= c.registe_dateWHENNOT MATCHEDTHENinsert (site_id, date1)values (c.sub_id, c.registe_date)
我把on 后改成 1=1,又报缺少减少字 on
是不是 这语法 oracle 9ir2 不支持啊
[/Quote]

对,只有在ORACLE 10I以上版本才完整支持MERGE INTU on 1WHEN MATCHED THEN updateset WHEN NOT MATCHED THEN insert ,,,
zhaoyu909707 2009-11-21
  • 打赏
  • 举报
回复
新手学习来了
maitianhust 2009-11-21
  • 打赏
  • 举报
回复
做ON条件的连接字段,(trunc(b.DATE1) = trunc(c.registe_date)) 是不能被更新的。
fxianxian 2009-11-20
  • 打赏
  • 举报
回复
在用merge的时候,是不容许更新on里面的columns的
wh62592855 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zcs_1 的回复:]
WHEN MATCHED THEN
  update set b.site_id = c.sub_id, b.date1 = c.registe_date

这句把b.date1 = c.registe_date去掉试试

[/Quote]试试这个
csc_hanker 2009-11-20
  • 打赏
  • 举报
回复
不过上面这么写貌似就实现不了你b.DATE1 = c.registe_date的想法了

mark
csc_hanker 2009-11-20
  • 打赏
  • 举报
回复

MERGE INTO games_data b
using (select sub_id, game_name, registe_date, rn
from (select sub_id,
game_name,
a.registe_date,
row_number() over(partition by game_name, sub_id, trunc(registe_date) order by sub_id, registe_date) as rn
from game_user_details a
where trunc(registe_date) = trunc(sysdate))
where rn = 1) c
on (trunc(b.DATE1) = trunc(c.registe_date))
WHEN MATCHED THEN
update set b.site_id = c.sub_id
WHEN NOT MATCHED THEN
insert (site_id, date1) values (c.sub_id, c.registe_date)


小灰狼W 2009-11-20
  • 打赏
  • 举报
回复
在你的语句中
on (trunc(b.DATE1) = trunc(c.registe_date))
b.date1是用来作为b表和c表的连接条件的
这个字段应该是不允许进行更新的
你将when matched子句里的b.date1 = c.registe_date去掉,看看能否执行成功
fuyou001 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wildwave 的回复:]
无效标识?
应该是b.date1作为on条件
不允许更新吧
将, b.date1 = c.registe_date去掉试试
[/Quote]
能说明白 点不
小灰狼W 2009-11-20
  • 打赏
  • 举报
回复
无效标识?
应该是b.date1作为on条件
不允许更新吧
将, b.date1 = c.registe_date去掉试试
小灰狼W 2009-11-20
  • 打赏
  • 举报
回复
on后面的条件要加括号
fuyou001 2009-11-20
  • 打赏
  • 举报
回复

MERGE INTO games_data b
using (select sub_id, game_name, registe_date, rn
from (select sub_id,
game_name,
a.registe_date,
row_number() over(partition by game_name, sub_id, trunc(registe_date) order by sub_id, registe_date) as rn
from game_user_details a
where trunc(registe_date) = trunc(sysdate))
where rn = 1) c
on 1=1
WHEN MATCHED THEN
update set b.site_id = c.sub_id, b.date1 = c.registe_date
WHEN NOT MATCHED THEN
insert (site_id, date1) values (c.sub_id, c.registe_date)


我把on 后改成 1=1,又报缺少减少字 on
是不是 这语法 oracle 9ir2 不支持啊
zcs_1 2009-11-20
  • 打赏
  • 举报
回复
WHEN MATCHED THEN
update set b.site_id = c.sub_id, b.date1 = c.registe_date

这句把b.date1 = c.registe_date去掉试试
耳海 2009-11-20
  • 打赏
  • 举报
回复
可以用PLSQL Developer跟踪看能找出问题?
呦呦 2009-11-20
  • 打赏
  • 举报
回复
up

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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