代码是:
Merge into dept_2 d   
using dept de
on(d.id=de.id)
when matched then
update set
d.id=de.id,
d.name=de.namedept_2,和dept 结构只有 id  name每次执行的时候都是 提示 :  ORA-38104: 无法更新 ON 子句中引用的列: "D"."ID"

解决方案 »

  1.   


    Merge into dept_2 d   
    using dept de
    on(d.id=de.id)
    when matched then
    update set
    --d.id=de.id, --去掉这个,oracle的限制不允许更新此列。再说,按照你的条件看这两个是相等的,没有更新的必要也。
    d.name=de.name
      

  2.   


    -- 对头,连接条件是 d.id=de.id , 怎么还想着去更新呢?不是脑子进水了么?
      

  3.   


    dept_2 表是空的 没有任何数据 ,我想把dept中的数据全部拷贝到dept_2 中, (没用过Merge练习一下)他们的表结构 和 字段名都是一样的
      

  4.   

    Merge into dept_2 d 
    using dept de
    on(d.id=de.id) --这个地方报: ORA-38104: 无法更新 ON 子句中引用的列: "D"."ID"
    when matched then
    update set
    --d.id=de.id, 
    d.name=de.name
      

  5.   

    Merge into dept_2 d  
    using dept de
    on(d.id=de.id)
    when matched then
    update set
    d.name=de.name
    when not matched then
    insert (id,name)
    values (de.id,de.name);

      

  6.   

    oracle10g 是可以把 when not matched then ..... 省略的
      

  7.   

    Merge into dept_2 d  using dept de 
    on(d.id=de.id)
    when matched then
    update set
    d.name=de.name
    when not matched then
    insert (id,name)
    values (de.id,de.name);-- 解释
    -- *1). Merge into dept_2 d  using dept de  
    --      从源表 dept (别名 de) 往 dept_2 表(别名d)中插入或更新数据-- *2). on(d.id=de.id) :源表(dept)与目标表(dept_2)的连接条件是 (dept_2.id=dept.id)-- *3). when matched then update set d.name=de.name
    --     当目标表找到与源表匹配的记录行(匹配条件:dept_2.id=dept.id ),
    --     则更新目标表(dept_2) 的 name字段值为 源表 (dept) 的name字段值-- *4). when not matched then insert (id,name) values (de.id,de.name)
    --     如果没有找到匹配记录(即:源表记录的id字段值,在目标表中不存在),
    --     则将源表中这样的记录插入目标表-- 简单理解为一句话:有:则更新;无:则插入!
      

  8.   


    -- 你都知道可以省略了,怎么就写不出来呢?
    -- 我是根据你这句话的意思写的撒:我想把dept中的数据全部拷贝到dept_2 中
      

  9.   

    scott@TBWORA> create table TB1
      2  (
      3    id   varchar2(4),
      4    colA varchar2(20),
      5    colB varchar2(20),
      6    colC varchar2(20)
      7  )
      8  ;表已创建。scott@TBWORA> alter table TB1
      2    add constraint PK_TB1_ID primary key (ID);表已更改。scott@TBWORA> create table TB2
      2  (
      3    id   varchar2(4),
      4    colA varchar2(20),
      5    colB varchar2(20),
      6    colC varchar2(20)
      7  )
      8  ;表已创建。scott@TBWORA> alter table TB2
      2    add constraint PK_TB2_ID primary key (ID);表已更改。scott@TBWORA> insert into tb1 values('1001', 'A1', 'B1', 'C1');已创建 1 行。scott@TBWORA> insert into tb1 values('1002', 'A2', 'B2', 'C2');已创建 1 行。scott@TBWORA> insert into tb1 values('1003', 'A3', 'B3', 'C3');已创建 1 行。scott@TBWORA>
    scott@TBWORA> insert into tb2 values('2001', 'A2', 'B2', 'C2');已创建 1 行。scott@TBWORA> insert into tb2 values('1003', 'A3', 'B3', 'C3');已创建 1 行。scott@TBWORA> commit;提交完成。scott@TBWORA> MERGE INTO TB2 USING TB1 ON (TB1.ID = TB2.ID)
      2  WHEN MATCHED THEN UPDATE SET TB2.ID = TB1.ID
      3  WHEN NOT MATCHED THEN INSERT VALUES (TB1.ID, TB1.colA, TB1.colB, TB1.colC);
    MERGE INTO TB2 USING TB1 ON (TB1.ID = TB2.ID)
                                          *
    第 1 行出现错误:
    ORA-38104: 无法更新 ON 子句中引用的列: "TB2"."ID"
    scott@TBWORA> MERGE INTO TB2 USING TB1 ON (TB1.ID = TB2.ID)
      2   WHEN MATCHED THEN UPDATE SET TB2.COLA = TB1.COLA, TB2.COLB=TB1.COLB, TB2.COLC=TB1.COLC
      3   WHEN NOT MATCHED THEN INSERT VALUES (TB1.ID, TB1.colA, TB1.colB, TB1.colC);3 行已合并。
    -- 请看上面的错误,再看1楼、2楼的回复! 猪!
      

  10.   


    ORA-38104
     不就是你遇到的一样的错误么?