列DOMAINS
、ID
、NAME
、CODE
を持つ2つの異なるスキーマにテーブル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はハーリングしません)、影響はありません。そのため、このような使用法は冗長です。ケース。)
変更したい場合は、追加します
when matched then update set a.id = b.id
when not matched then insert...
の前(e.g.Oracleは
when matched then update
構文をサポートしています。以下のDemoを参照してください)
現在のケースでは次のように進みます:
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 );
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.