web-dev-qa-db-fra.com

Table MERGE, ne rien faire en cas de correspondance

J'ai une table DOMAINS dans 2 schémas différents avec les colonnes ID, NAME, CODE, DESCRIPTION.

Pour que NAME existe dans un nouveau schéma, il doit utiliser ID existant sans aucune fusion; pour ces nouveaux enregistrements NAME, il doit être inséré avec ID de l'ancien schéma.

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);

Comment puis-je interpréter la portion de do nothing dans la requête ci-dessus?

6
user2102665

Pour votre cas, pas besoin d'utiliser la pièce:

when matched then update ...

( en utilisant when matched then update set a.id = a.id est accepté (Oracle ne lance pas) mais n'a aucun impact, donc une telle utilisation est redondante, car vous ne voulez rien changer pour la casse correspondante.)

Si vous voulez changer, ajoutez

when matched then update set a.id = b.id

avant when not matched then insert...

( par exemple, Oracle prend en charge when matched then update syntaxe. Reportez-vous à la démo ci-dessous)

Continuez avec ce qui suit pour le cas actuel:

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

Demo

8
Barbaros Özhan

La syntaxe Oracle SQL prend en charge l'absence de when matched then update clause.

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.
7
Vijay Balebail