MERGE表,匹配时什么也不做

时间:2018-04-16 02:49:47

标签: sql oracle merge match sql-merge

我在2个不同的架构中有一个表DOMAINS,其中包含IDNAMECODEDESCRIPTION列。

对于新架构中存在的任何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的部分?

3 个答案:

答案 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

SQL Fiddle Demo

答案 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
在...
当不匹配时
...

我已经验证是有效的...