Oracle에서는 "병합"을 사용하여 테이블의 데이터를 다른 테이블에 삽입할 수 있습니다. 데이터가 삽입된 테이블에 이미 있으면 해당 데이터가 업데이트됩니다. 데이터가 삽입된 테이블에 새 데이터가 추가됩니다.
이 튜토리얼의 운영 환경: Windows 10 시스템, Oracle 11g 버전, Dell G3 컴퓨터.
Oracle9g는 하나의 SQL 문에서 테이블에 대한 삽입 및 업데이트 작업을 동시에 수행할 수 있습니다. MERGE 명령은 하나 이상의 데이터 소스에서 행을 선택합니다. 하나 이상의 테이블에 삽입합니다. Oracle 10g에서는 MERGE에 다음과 같은 개선 사항이 있습니다.
1. UPDATE 또는 INSERT 절은 선택 사항입니다.
2 UPDATE 및 INSERT 절은 WHERE 절을 사용하여 추가할 수 있습니다.
3. ON 조건에서는 모든 행을 대상 테이블에 삽입하는 데 사용됩니다. 4. UPDATE 절 뒤에 DELETE 절을 추가할 수 있습니다. 5. 소스 테이블은 using 키워드가 뒤에 오는 테이블이고, 대상 테이블은 병합될 테이블입니다. 6. 병합 대상 테이블에서 모든 업데이트, 삽입 및 삭제가 수행됩니다. 병합은 이미 작업을 위한 테이블을 공식화했기 때문에 업데이트, 삽입 및 삭제에서는 테이블 이름을 표시할 필요가 없습니다7. 즉, 병합 기능은 테이블 B와 새 테이블 A를 사용하는 문제를 해결하는 것입니다. 테이블 A에 데이터가 없으면 테이블 B의 데이터를 테이블 A에 삽입하거나 테이블에 이미 데이터가 있으면 업데이트하고, 그렇지 않으면 새 데이터를 추가합니다.구문:
MERGE INTO [your table-name] [rename your table here] USING ( [write your query here] )[rename your query-sql and using just like a table] ON ([conditional expression here] AND [...]...) WHEN MATHED THEN [here you can execute some update sql or something else ] WHEN NOT MATHED THEN [execute something else here ! ]
다음으로 직접 테스트해 보겠습니다.
요구 사항 1: 테이블에 데이터가 이미 있으면 업데이트합니다. 그렇지 않으면 추가합니다.
먼저 TEST_ONE 테이블을 만듭니다.
create table TEST_ONE( ID NUMBER not null primary key, NAME VARCHAR2(255), IP VARCHAR2(255), MEMO VARCHAR2(255))commit;
INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (1, '2', '3', '周文军'); INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (2, '66', '366', '2656'); INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (3, '5656', '626', '2626'); INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (4, '5656', '2626', '626');
새로운 데이터를 추가해야 할 경우 일반적으로 다음과 같이 합니다
INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (5, 'mrhu', '127.0.0.1.0', '王先生的IP');
하지만 먼저 ID를 사용하고 싶습니다. 새로운 데이터는 없지만 데이터가 업데이트되는 것으로 판단하세요. 이를 달성하는 방법은 무엇입니까?
그러면 병합 명령이 여기에 있습니다. 코드를 입력하세요:
merge into TEST_ONE mtb using (select '5' as id, 'mrhu' as name,'127.0.0.1.0' as ip,'王先生的IP' as memo from dual)mmb on (mtb.id = mmb.id)when matched THENupdate set mtb.name = mmb.name,mtb.ip = mmb.ip,mtb.memo=mmb.memo when not matched theninsert (mtb.id, mtb.name,mtb.ip,mtb.memo) VALUES(mmb.id,mmb.name,mmb.ip,mmb.memo);
테이블의 데이터를 살펴보겠습니다:
데이터가 성공적으로 추가되었습니다!
그럼 업데이트를 어떻게 테스트하나요? 매우 간단합니다. memo='Mr. Wang's IP' to memo='This beautiful girl's IP' for test
merge into TEST_ONE mtb using (select '5' as id, 'mrhu' as name,'127.0.0.1.0' as ip,'本大美女的IP' as memo from dual)mmb on (mtb.id = mmb.id)when matched THENupdate set mtb.name = mmb.name,mtb.ip = mmb.ip,mtb.memo=mmb.memo when not matched theninsert (mtb.id, mtb.name,mtb.ip,mtb.memo) VALUES(mmb.id,mmb.name,mmb.ip,mmb.memo);
데이터가 성공적으로 업데이트되었습니다!
요구사항 2: 테이블 A의 데이터를 테이블 B에 추가합니다. 기본 키로 판단해야 합니다. 데이터가 포함되어 있으면 업데이트하세요.
테이블 B로 TEST_TWO를 또 생성하고 TEST_ONE을 추가합니다. 테이블 A.
create table tes( ID NUMBER not null primary key, CODE VARCHAR2(255), MEMO VARCHAR2(255));commit;
INSERT INTO ROOT.TEST_TWO (ID, CODE, MEMO) VALUES (5, 'mrhu', '隔壁老王的IP');
merge into TEST_TWO mtb using (select id,name,ip,memo from TEST_ONE) mmb on (mtb.id = mmb.id)when matched THENUPDATE set mtb.code = mmb.name,mtb.memo = mmb.memo when not matched THENinsert (mtb.id,mtb.code,mtb.memo) values (mmb.id,mmb.name,mmb.memo);
실행 결과가 예상한 결과와 일치합니다. 좋아요, 병합 사용법을 배웠나요? 그것!
Oracle Video Tutorial
"위 내용은 오라클에서 병합의 사용법은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!