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 

解决方案 »

  1.   

    可以用PLSQL Developer跟踪看能找出问题?
      

  2.   

    WHEN MATCHED THEN
      update set b.site_id = c.sub_id, b.date1 = c.registe_date这句把b.date1 = c.registe_date去掉试试
      

  3.   


    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 不支持啊
      

  4.   

    无效标识?
    应该是b.date1作为on条件
    不允许更新吧
    将, b.date1 = c.registe_date去掉试试
      

  5.   

    在你的语句中
    on (trunc(b.DATE1) = trunc(c.registe_date))
    b.date1是用来作为b表和c表的连接条件的
    这个字段应该是不允许进行更新的
    你将when matched子句里的b.date1 = c.registe_date去掉,看看能否执行成功
      

  6.   


    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)
      

  7.   

    不过上面这么写貌似就实现不了你b.DATE1 = c.registe_date的想法了
      

  8.   

    在用merge的时候,是不容许更新on里面的columns的
      

  9.   

    做ON条件的连接字段,(trunc(b.DATE1) = trunc(c.registe_date)) 是不能被更新的。
      

  10.   


    对,只有在ORACLE 10I以上版本才完整支持MERGE INTU on 1WHEN MATCHED THEN updateset  WHEN NOT MATCHED THEN insert ,,,