MERGE 문 및 SQL Server 데이터 수정 소개
MERGE 문은 꽃밥과 일치하는 값을 기반으로 한 테이블을 변경하는 데 사용됩니다. 삽입, 업데이트 및 삭제 작업을 하나의 문으로 결합하는 데 사용할 수 있습니다. 이 기사에서는 MERGE 문을 사용하는 방법을 살펴 보겠습니다. 몇 가지 예를 통해 몇 가지 모범 사례, 제한 사항 및 요약에 대해 논의합니다.
이것은 일련의 기사 중 다섯 번째 기사입니다. SQL Server 데이터 수정 설명 소개를 읽고 처음부터 시작할 수 있습니다.
이 강의의 모든 예제는 Microsoft SQL Server Management Studio 및 AdventureWorks2012 데이터베이스를 기반으로합니다. 내 가이드 SQL Server 시작하기를 사용하여 이러한 무료 도구를 사용할 수 있습니다.
시작하기 전에
이 기사에서는 AdventureWorks 데이터베이스를 예제로 사용하지만 다음을 만들기로 결정했습니다. 다루는 개념을 더 잘 설명하기 위해 데이터베이스 내에서 사용할 수있는 몇 가지 예제 테이블입니다. 여기에서 실행해야하는 스크립트를 찾을 수 있습니다. MERGE와 관련된 특수 섹션이 있습니다.
기본 구조
MERGE 문은 INSERT, DELETE 및 UPDATE 작업을 하나의 테이블로 결합합니다. 작동 방식을 이해하면 데이터를 동기화하기 위해 세 문을 모두 개별적으로 사용하여 절차를 단순화 할 수 있습니다.
다음은 merge 문에 대한 일반화 된 형식입니다.
MERGE targetTableUsing sourceTableON mergeConditionWHEN MATCHEDTHEN updateStatementWHEN NOT MATCHED BY TARGETTHEN insertStatementWHEN NOT MATCHED BY SOURCETHEN deleteStatement
병합 문은 sourceTable과 targetTable의 두 테이블을 사용하여 작동합니다. targetTable은 sourceTable에 포함 된 데이터를 기반으로 수정되는 테이블입니다.
mergeCondition을 사용하여 두 테이블을 비교합니다. . 이 조건은 sourceTable의 행이 targetTable과 일치하는 방식을 지정합니다. INNER JOINS에 익숙하다면 이것을 행을 일치시키는 데 사용되는 결합 조건으로 생각할 수 있습니다.
일반적으로 기본 키와 같은 고유 식별자와 일치합니다. 소스 테이블이 NewProduct이고 대상 ProductMaster이고 두 ProductID의 기본 키인 경우 사용할 좋은 병합 조건은 다음과 같습니다.
NewProduct.ProductID = ProductMaster.ProductID
병합 조건 결과 MATCHED, NOT MATCHED 또는 NOT MATCHED BY SOURCE.
병합 조건
다양한 조건의 의미를 살펴 보겠습니다.
MATCHED – 일치 조건을 만족하는 행입니다. 소스 및 대상 테이블 모두에 공통입니다. 다이어그램에서는 녹색으로 표시됩니다. 합병 명세서에서이 조건을 사용할 때, sourceTable 열 값으로 대상 행 열을 업데이트하는 것과 가장 비슷합니다.
NOT MATCHED – NOT MATCHED BY TARGET이라고도합니다. 대상 테이블의 어떤 행과도 일치하지 않는 소스 테이블의 행입니다. 이러한 행은 위의 파란색 영역으로 표시됩니다. 대부분의 경우 소스 행이 targetTable에 추가되어야한다고 추론하는 데 사용할 수 있습니다.
NOT MATCHED BY SOURCE – 이들은 소스 레코드와 일치하지 않는 대상 테이블의 행입니다. 주황색 영역의 행입니다. targetTable 데이터를 소스와 완전히 동기화하는 것이 목표 인 경우이 일치 조건을 사용하여 행을 삭제합니다.
이 작동 방식을 이해하는 데 문제가있는 경우 병합 조건이 다음과 같다고 생각하세요. 조인 조건. 녹색 섹션의 ROWS는 병합 조건과 일치하는 행을 나타내고 파란색 섹션의 행은 SourceTable에 있지만 대상에는없는 행입니다. 주황색 섹션의 행은 대상에만있는 행입니다.
이러한 일치 시나리오를 제공하면 추가, 제거 및 업데이트 활동을 단일 명령문으로 쉽게 통합하여 둘 사이의 변경 사항을 동기화 할 수 있습니다. 테이블.
예제를 살펴 보겠습니다.
MERGE 예
목표가 esqlProductSource의 변경 사항을 esqlProductTarget과 동기화하는 것이라고 가정 해 보겠습니다. 다음은이 두 테이블의 다이어그램입니다.
참고 :이 예에서는 제가 설명한 스크립트를 실행했습니다. esqlProductSource 및 esqlProductTarget이라는 두 개의 테이블을 만들고 채우는 소개에서.
MERGE 문을 구성하기 전에 UPDATE, INSERT 및 DELETE 문을 사용하여 테이블을 동기화하여 수정하고 추가하는 방법을 살펴 보겠습니다. , 대상 테이블에서 행을 제거합니다.
이 작업을 개별적으로 수행하는 방법을 살펴보면 단일 작업으로 결합되는 것이 더 합리적이라고 생각합니다.
UPDATE를 사용하여 변경 사항 동기화 한 테이블에서 다음 테이블로
제품 소스의 변경된 값으로 대상 테이블을 업데이트하려면 UPDATE 문을 사용할 수 있습니다. ProductID가 두 테이블의 기본 키이므로 테이블 간의 최상의 선택 일치 행이됩니다.
소스 열을 사용하여 대상 테이블의 열 값을 업데이트하려는 경우 다음 업데이트 문을 사용하여 수행 할 수 있습니다.
UPDATE esqlProductTargetSET Name = S.Name, ProductNumber = S.ProductNumber, Color = S.ColorFROM esqlProductTarget T INNER JOIN esqlProductSource S ON S.ProductID = T.ProductID
이 명령문은 productID와 일치하는 esqlProductSource에서 찾은 해당 열 값으로 esqlProductTarget의 열을 업데이트합니다.
한 테이블에는 있지만 다른 테이블에는없는 행 INSERT
이제 어떻게하는지 살펴 보겠습니다. 제품 타겟에 삽입해야하는 소스 테이블의 행을 식별 할 수 있습니다. 이를 위해 하위 쿼리를 사용하여 소스 테이블에서 대상에없는 행을 찾을 수 있습니다.
INSERT INTO esqlProductTarget (ProductID, Name, ProductNumber, Color)SELECT S.ProductID, S.Name, S.ProductNumber, S.ColorFROM esqlProductSource SWHERE NOT EXISTS (SELECT T.ProductID FROM esqlProductTarget T WHERE T.ProductID = S.ProductID)
참고 : 외부 조인을 사용할 수도 있습니다. 똑같이. 이유에 관심이 있다면이 기사를 확인하십시오.
이 명령문은 esqlProductTarget에서 찾을 수없는 esqlProductSource의 모든 행에서 esqlProductTarget에 새 행을 삽입합니다.
제거 행
우리가해야하는 마지막 동기화 활동은 SQL 소스에없는 대상 테이블의 모든 행을 제거합니다. insert 문에서했던 것처럼 하위 쿼리를 사용합니다. 그러나 이번에는 esqlProductSource에서 찾을 수없는 esqlProductTarget의 행을 식별합니다. 다음은 사용할 수있는 DELETE 문입니다.
DELETE esqlProductTargetFROM esqlProductTarget TWHERE NOT EXISTS (SELECT S.ProductID FROM esqlProductSource S WHERE T.ProductID = S.ProductID)
이제 다양한 작업을 개별적으로 수행하는 방법을 살펴 보았으므로 merge 문.
중요한 작업의 대부분은 병합 조건과 그 결과에 의해 수행됩니다. 반복적으로 일치를 설정하는 대신 delete 문을 int처럼 한 번만 수행합니다.
Insert 문을 위의 merge 문과 다시 비교합니다.
INSERT INTO esqlProductTarget (ProductID, Name, ProductNumber, Color)SELECT S.ProductID, S.Name, S.ProductNumber, S.ColorFROM esqlProductSource SWHERE NOT EXISTS (SELECT T.ProductID FROM esqlProductTarget T WHERE T.ProductID = S.ProductID)
MERGE 문이 소스 및 대상 테이블을 설정하고 일치 방식을 지정하면 빨간색으로 코드화 된 모든 항목이 중복됩니다. 따라서 병합의 삽입 부분이 아닙니다.
OUTPUT을 사용하여 MERGE 변경 사항 기록
OUTPUT 절을 사용하여 변경 사항을 기록 할 수 있습니다. 이 경우 특수 변수 $ action을 사용하여 병합 작업을 기록 할 수 있습니다. 이 변수는 “INSERT”, “UPDATE”또는 “DELETE”의 세 가지 값 중 하나를 사용합니다.
이 예제를 계속 사용하지만 이번에는 변경 사항을 기록하고 요약합니다.
위의 내용이 새로운 샘플 데이터에서 실행되면 다음 요약이 생성됩니다.