programing

MERGE 테이블, 일치 시 아무것도 수행하지 않음

sourcejob 2023. 11. 5. 11:34
반응형

MERGE 테이블, 일치 시 아무것도 수행하지 않음

자리가 있습니다.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 ...

(사용은 허용되지만(Oracle은 Hurl이 되지 않음) 영향이 없으므로, 일치하는 경우에 대해 아무것도 변경하고 싶지 않으므로, 이러한 사용은 중복됩니다.)

변경하려면 추가합니다.

WHEN MATCHED THEN UPDATE SET a.id = b.id

전에WHEN NOT MATCHED THEN INSERT...

(예:Oracle은 구문을 지원합니다. 아래 데모 참조)

현재 사례에 대해 다음과 같이 진행합니다.

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

Demo

그건 그렇고, 그 다음에 나오는 부분은.USING키워드는 하위 쿼리가 아니라 테이블 또는 보기여야 합니다.현재 사례에 대해 평가한 결과:

MERGE INTO domains ds       --> "ds" : "domains" source
     USING v_domains dt     --> "dt" : "domains" target
        ON ( ds.name = dt.name )
      WHEN NOT MATCHED THEN INSERT( ds.id, ds.name, ds.code, ds.description ) 
                            VALUES( dt.id, dt.name, dt.code, dt.description )

다음을 통해 뷰를 작성한 후 위의 문장과 동일하게 사용될 수 있습니다.

CREATE OR REPLACE VIEW v_domains AS
SELECT 2 id, 'Domain A' name, 'D.A.' code, 'This is Domain A' description 
  FROM domains

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를 이용하여
...위에
그 때와 일치하지 않을 때.
...

제가 확인한 바로는...

언급URL : https://stackoverflow.com/questions/49848995/merge-table-do-nothing-when-matched

반응형