我在2个不同的架构中有一个表DOMAINS
,其中包含ID
,NAME
,CODE
,DESCRIPTION
列。
对于新架构中存在的任何NAME
,它应该使用现有的ID
而不进行任何合并;对于那些新的NAME
记录,它应该从旧架构中插入ID
。
MERGE INTO DOMAINS A
USING (SELECT ID,NAME,CODE,DESCRIPTION FROM <Old Schema 6.1>.DOMAINS@DB_MIG_61_TO_74) B
ON(A.NAME = B.NAME)
WHEN MATCHED **<do nothing>**
WHEN NOT MATCHED THEN INSERT(A.ID,A.NAME,A.CODE,A.DESCRIPTION)
VALUES(B.ID,B.NAME,B.CODE,B.DESCRIPTION);
如何解释上述查询中do nothing
的部分?
答案 0 :(得分:7)
举个例子:
WHEN MATCHED THEN UPDATE SET A.ID = A.ID
部分可用于无需更改。
CREATE TABLE DOMAINS(ID int,NAME varchar2(50),CODE varchar2(50),DESCRIPTION varchar2(50));
INSERT INTO DOMAINS values(1,'Domain A','D A','This is Domain A');
MERGE INTO DOMAINS A
USING (SELECT 2 ID,'Domain A' NAME,'D A' CODE,'This is Domain A' DESCRIPTION FROM DOMAINS ) B
ON(A.NAME = B.NAME)
WHEN MATCHED THEN UPDATE SET A.ID=A.ID
WHEN NOT MATCHED THEN INSERT(A.ID,A.NAME,A.CODE,A.DESCRIPTION)
VALUES(B.ID,B.NAME,B.CODE,B.DESCRIPTION);
SELECT * FROM DOMAINS;
ID NAME CODE DESCRIPTION
-- -------- ----- ----------------
1 Domain A D A This is Domain A
MERGE INTO DOMAINS A
USING (SELECT 2 ID,'Domain B' NAME,'D B' CODE,'This is Domain B' DESCRIPTION FROM DOMAINS ) B
ON(A.NAME = B.NAME)
WHEN MATCHED THEN UPDATE SET A.ID=A.ID
WHEN NOT MATCHED THEN INSERT(A.ID,A.NAME,A.CODE,A.DESCRIPTION)
VALUES(B.ID,B.NAME,B.CODE,B.DESCRIPTION);
SELECT * FROM DOMAINS;
ID NAME CODE DESCRIPTION
-- -------- ----- ----------------
1 Domain A D A This is Domain A
2 Domain B D B This is Domain B
答案 1 :(得分:5)
Oracle SQL语法支持没有任何when matched then update
子句。
drop table ft purge;
create table ft (c1 number, c2 varchar2(10));
drop table ld purge;
create table ld (c1 number, c2 varchar2(10));
insert into ft values (1,'a');
insert into ld values (1,'b');
insert into ld values (2,'c');
commit;
merge into ft
using ld
on (ft.c1 = ld.c1)
when not matched then
insert (c1,c2) values (ld.c1,ld.c2);
select * from ft;
C1 C2
--- ---
1 a
2 c
2 rows selected.
答案 2 :(得分:0)
为什么不使用
合并成A
使用 B
在...
当不匹配时
...
我已经验证是有效的...