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?
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
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.