Preloader image
DDD

데이터베이스

MERGE - INSERT / UPDATE

작성자 관리자 (admin)
조회수 695
입력일 2020-02-01 16:41:11
  • 예제 1: 설명이 변경된 활동의 경우 아카이브 테이블에서 설명을 갱신하십시오. 새 활동의 경우 아카이브 테이블에 삽입하십시오. 아카이브 및 활동 테이블 둘 모두에는 기본 키로서 활동이 있습니다.

    MERGE INTO archive ar USING
    (SELECT activity, description FROM activities) ac ON (ar.activity = ac.activity)
    WHEN MATCHED THEN
    UPDATE SET description = ac.description
    WHEN NOT MATCHED THEN
    INSERT (activity, description) VALUES (ac.activity, ac.description)

  • 예제 2: 운송 테이블을 사용하면 행을 인벤토리 테이블로 병합하여, 일치하는 행에 대해 운송 테이블의 파트 계수별 수량을 늘릴 수 있습니다. 그렇지 않은 경우 새 partno를 인벤토리 테이블에 삽입하십시오.

    MERGE INTO inventory AS IN USING
    (
    SELECT partno, description, COUNT
    FROM shipment
    WHERE shipment.partno IS NOT NULL) AS sh ON (in.partno = sh.partno)
    WHEN MATCHED THEN
    UPDATE SET description = sh.description, quantity = in.quantity + sh.count
    WHEN NOT MATCHED THEN
    INSERT (partno, description, quantity) VALUES (sh.partno, sh.description, sh.count)

  • 예제 3: 트랜잭션 테이블을 사용하면 행을 계정 테이블로 병합하고, 계정 ID에 대한 트랜잭션 세트로부터 밸런스를 갱신하고, 아직 존재하지 않는 통합된 트랜잭션으로부터 새 계정을 삽입합니다.

    MERGE INTO account AS a USING (
    SELECT id, SUM(amount) sum_amount
    FROM TRANSACTION
    GROUP BY id) AS t ON a.id = t.id WHEN MATCHED THEN
    UPDATE SET balance = a.balance + t.sum_amount WHEN NOT MATCHED THEN
    INSERT (id, balance) VALUES (t.id, t.sum_amount)

  • 예제 4: transaction_log 테이블을 사용하여, 행을 employee_file 테이블로 병합하고, 전화와 사무실을 트랜잭션 시간을 기반으로 최신 transaction_log 행으로 갱신하고, 행이 아직 존재하지 않는 최신 새 employee_file 행을 삽입합니다.

    MERGE INTO employee_file AS e USING (
    SELECT empid, phone, office
    FROM (
    SELECT empid, phone, office, ROW_NUMBER() OVER (PARTITION BY empid
    ORDER BY transaction_time DESC) rn
    FROM transaction_log) AS nt
    WHERE rn = 1) AS t ON e.empid = t.empid WHEN MATCHED THEN
    UPDATE SET (phone, office) = (t.phone, t.office) WHEN NOT MATCHED THEN
    INSERT (empid, phone, office) VALUES (t.empid, t.phone, t.office)

  • 예제 5: 직원 행의 동적으로 제공된 값을 사용하여, 데이터가 기존 직원에 해당하는 경우 마스터 직원 테이블을 갱신하거나 데이터가 새 직원용인 경우에는 행을 삽입합니다. 다음 예제는 C 프로그램의 코드 조각입니다.

    hv1 = "MERGE INTO employee AS t USING TABLE(VALUES(CAST (? AS CHAR(6)), CAST (? AS VARCHAR(12)), CAST (? AS CHAR(1)), CAST (? AS VARCHAR(15)), CAST (? AS SMALLINT), CAST (? AS INTEGER))) s(empno, firstnme, midinit, lastname, edlevel, salary) ON t.empno = s.empno WHEN MATCHED THEN UPDATE SET salary = s.salary WHEN NOT MATCHED THEN INSERT (empno, firstnme, midinit, lastname, edlevel, salary) VALUES (s.empno, s.firstnme, s.midinit, s.lastname, s.edlevel, s.salary)"; EXEC SQL PREPARE s1 FROM :hv1; EXEC SQL EXECUTE s1 USING '000420', 'SERGE', 'K', 'FIELDING', 18, 39580;

  • 예제 6:아카이브 테이블에서 그룹 A에 의해 구성된 활동 목록을 갱신합니다. 모든 오래된 활동을 삭제하고 아카이브 테이블에서 변경된 경우 활동 정보(설명 및 날짜)를 갱신합니다. 다가오는 새 활동의 경우 아카이브에 삽입하십시오. 활동의 날짜를 알 수 없는 경우 오류를 신호로 보냅니다. 아카이브 테이블에 활동의 날짜를 지정해야 합니다. 각 그룹에 활동 테이블이 있습니다. 예를 들어, activities_groupA에는 이들이 조직하는 모든 활동이 포함되고, 아카이브 테이블에는 회사에서 서로 다른 그룹에 의해 조직된 모든 다가오는 활동이 포함됩니다. 아카이브 테이블에는 그룹 및 활동이 기본 키로 있으며 날짜는 널 입력 가능이 아닙니다. 모든 활동 테이블에는 활동이 기본 키로 있습니다. 아카이브에서 last_modified 컬럼은 CURRENT TIMESTAMP를 사용하여 기본값으로 정의됩니다.

    MERGE INTO archive ar USING (
    SELECT activity, description, DATE, last_modified
    FROM activities_groupA) ac ON (ar.activity = ac.activity) AND ar.group = 'A' WHEN MATCHED AND ac.date IS NULL THEN SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = ac.activity CONCAT ' cannot be modified. Reason: Date is not known' WHEN MATCHED AND ac.date < CURRENT DATE THEN
    DELETE WHEN MATCHED AND ar.last_modified < ac.last_modified THEN
    UPDATE SET (description, DATE, last_modified) = (ac.description, ac.date, DEFAULT) WHEN NOT MATCHED AND ac.date IS NULL THEN SIGNAL SQLSTATE '70002' SET MESSAGE_TEXT = ac.activity CONCAT ' cannot be inserted. Reason: Date is not known' WHEN NOT MATCHED AND ac.date >= CURRENT DATE THEN
    INSERT (
    GROUP, activity, description, DATE) VALUES ('A', ac.activity, ac.description, ac.date) ELSE IGNORE

^