MERGE table,匹配时什么都不做
MERGE table, do nothing when matched
我在 2 个不同的模式中有一个 table 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
的部分?
对于您的情况,无需使用以下部分:
WHEN MATCHED THEN UPDATE ...
( using WHEN MATCHED THEN UPDATE SET a.id = a.id
被接受(Oracle 不投掷)但是没有影响,所以,这样的用法是多余的,因为你不想为匹配大小写。 )
If you wanted to change, then add
WHEN MATCHED THEN UPDATE SET a.id = b.id
before WHEN NOT MATCHED THEN INSERT...
( e.g.Oracle supports WHEN MATCHED THEN UPDATE
syntax. Refer the
Demo below )
继续当前案例的以下内容:
SQL> CREATE TABLE domains(
id INT,
name VARCHAR2(50),
code VARCHAR2(50),
description VARCHAR2(50)
);
SQL> INSERT INTO domains VALUES(1,'Domain A','D.A.','This is Domain A');
SQL> 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 NOT MATCHED THEN INSERT( a.id, a.name, a.code, a.description )
VALUES( b.id, b.name, b.code, b.description );
SQL> SELECT * FROM domains;
ID NAME CODE DESCRIPTION
-- -------- ----- ----------------
1 Domain A D.A. This is Domain A
SQL> DELETE domains;
SQL> INSERT INTO domains VALUES(1,'Domain A','D.A.','This is Domain A');
-- we're deleting and inserting the same row again
SQL> 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 NOT MATCHED THEN INSERT( a.id, a.name, a.code, a.description )
VALUES( b.id, b.name, b.code, b.description );
SQL> 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
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.
为什么不用
合并到 A
使用 B
在...
如果不匹配则
...
我已验证有效...
我在 2 个不同的模式中有一个 table 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
的部分?
对于您的情况,无需使用以下部分:
WHEN MATCHED THEN UPDATE ...
( using WHEN MATCHED THEN UPDATE SET a.id = a.id
被接受(Oracle 不投掷)但是没有影响,所以,这样的用法是多余的,因为你不想为匹配大小写。 )
If you wanted to change, then add
WHEN MATCHED THEN UPDATE SET a.id = b.id
before
WHEN NOT MATCHED THEN INSERT...
( e.g.Oracle supports
WHEN MATCHED THEN UPDATE
syntax. Refer the Demo below )
继续当前案例的以下内容:
SQL> CREATE TABLE domains(
id INT,
name VARCHAR2(50),
code VARCHAR2(50),
description VARCHAR2(50)
);
SQL> INSERT INTO domains VALUES(1,'Domain A','D.A.','This is Domain A');
SQL> 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 NOT MATCHED THEN INSERT( a.id, a.name, a.code, a.description )
VALUES( b.id, b.name, b.code, b.description );
SQL> SELECT * FROM domains;
ID NAME CODE DESCRIPTION
-- -------- ----- ----------------
1 Domain A D.A. This is Domain A
SQL> DELETE domains;
SQL> INSERT INTO domains VALUES(1,'Domain A','D.A.','This is Domain A');
-- we're deleting and inserting the same row again
SQL> 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 NOT MATCHED THEN INSERT( a.id, a.name, a.code, a.description )
VALUES( b.id, b.name, b.code, b.description );
SQL> 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
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.
为什么不用
合并到 A
使用 B
在...
如果不匹配则
...
我已验证有效...