여러 테이블에서 데이터 병합
데이터베이스 작업에서 SQL 병합 작업을 수행해야 하는 경우가 있습니다. DML 옵션은 원본 테이블과의 차이점에 따라 대상 테이블에서 행을 삽입, 업데이트, 삭제하여 두 테이블을 동기화합니다. 수정되는 테이블을 ‘대상’ 테이블이라고 합니다. 변경할 행을 결정하는 데 사용되는 테이블을 ‘원본’ 테이블이라고 합니다.
MERGE는 하나 이상의 조건에 따라 데이터를 수정합니다.
- 대상 테이블에 원본 데이터와 일치하는 행이 있는 경우 대상 테이블의 데이터를 업데이트할 수 있습니다.
- 대상 테이블에 원본 데이터와 일치하는 항목이 없는 경우 대상 테이블에 데이터를 삽입할 수 있습니다.
- 원본에 일치하는 항목이 없는 경우 대상 데이터를 삭제할 수 있습니다.
MERGE 문의 일반적인 구문은 다음과 같습니다. 지정된 열에서 대상과 원본을 일치시키고 대상과 원본 간에 일치하는 항목이 있는 경우 대상 테이블에 대해 수행할 작업을 지정합니다. 일치하는 항목이 없으면 작업을 지정합니다. 작업은 INSERT, UPDATE 또는 DELETE 작업일 수 있습니다. 이 코드는 원본과 대상 간에 일치하는 항목이 있을 때 UPDATE가 수행된다는 것을 나타냅니다. INSERT는 대상에 일치하는 데이터가 없는 원본 데이터가 있을 때 수행됩니다. 마지막으로 원본에서 일치하는 항목이 없는 대상 데이터가 있는 경우 DELETE가 수행됩니다. MERGE 문에는 다른 여러 가지 형식이 있습니다.
MERGE INTO schema_name.table_name AS TargetTbl
USING (SELECT <select_list>) AS SourceTbl
ON (TargetTbl.col1 = SourceTbl.col1)
WHEN MATCHED THEN
UPDATE SET TargetTbl.col2 = SourceTbl.col2
WHEN NOT MATCHED [BY TARGET] THEN
INSERT (<column_list>)
VALUES (<value_list>)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
필요한 MERGE 문 요소만 사용하는 것이 가능합니다. 예를 들어 기존 청구서 및 새 청구서에 대한 수정 버전이 혼합된 준비된 청구서 업데이트 테이블이 데이터베이스에 포함되어 있다고 가정합니다. WHEN MATCHED 및 WHEN NOT MATCHED 절을 사용하여 필요에 따라 청구서 데이터를 업데이트하거나 삽입할 수 있습니다.
MERGE INTO Sales.Invoice as i
USING Sales.InvoiceStaging as s
ON i.SalesOrderID = s.SalesOrderID
WHEN MATCHED THEN
UPDATE SET i.CustomerID = s.CustomerID,
i.OrderDate = GETDATE(),
i.PurchaseOrderNumber = s.PurchaseOrderNumber,
i.TotalDue = s.TotalDue
WHEN NOT MATCHED THEN
INSERT (SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue)
VALUES (s.SalesOrderID, s.CustomerID, s.OrderDate, s.PurchaseOrderNumber, s.TotalDue);