17,086
社区成员
发帖
与我相关
我的任务
分享
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 行已合并。
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字段值,在目标表中不存在),
-- 则将源表中这样的记录插入目标表
-- 简单理解为一句话:有:则更新;无:则插入!
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