면이 존재하고 문 병합

0

질문

나는 데이터가 있으로 흐르는 한 테이블에서 여러 다른 표고 말할 수 있습니다:되므로 성능이 향상되 그때 내가 병합된 저장 proc 는 데이터에서 테이블 병합으로 표 B.

그러나,무언가를하지 않는 것 같습니다. 면 잘라내과 데이터를 로드 그것은 작동하지만,경우에는 자르고,부하와 가져오면 쿼리하여 eachh 시간는 오류 메시지가 나타 말

Msg8672,수 16,상태 1,절차 Merge_Table_A,선 4[배치 시작 선 0] MERGE 시도를 업데이트하거나 삭제를 동일한 행니다. 이런 경우는 대상 행 일보다 더 하나의 소스 행이 있습니다. MERGE 문 업데이트할 수 없습니다/삭제 같은 행의 목표 테이블이 있습니다.... 정에 절을 지키는 대상 행에서 일치하는 하나의 소스로 행하거나 사용하여 그룹에 의해 절하는 그룹 소스 행이 있습니다.

어떻게 극복할 수 있는 이?

할 수 있을 점진적으로 데이터를 로드하지 않을 잘라내지만,부하가 동시에 저장 proc 업데이트하거나 삽입 또는 사료 경우 행은 이미 존재합니다.

azure sql-merge sql-server
2021-11-24 01:52:34
1

최고의 응답

1

보인다 당신이 행복 에서 당신의 목표 테이블에 적재되는 이전부터 실행됩니다.

참고:일치에서 병합을 고려하지 않는 행 삽입어(중복)실행하는 동안 병합 자체입니다.

아래에 나의 재현 예 샘플 데이터:

Table1:초기 데이터

enter image description here

Table2:Taget 테이블

enter image description here

Merge:

MERGE tb2 AS Target
USING tb1   AS Source
 ON Source.firstname = Target.firstname and 
    Source.lastname = Target.lastname 

-- For Inserts
WHEN NOT MATCHED BY Target THEN
INSERT (firstname, lastname, updated_date) 
VALUES (Source.firstname, Source.lastname, source.updated_date)

-- For Updates
WHEN MATCHED THEN UPDATE SET
   Target.updated_date      = Source.updated_date

-- For Deletes
WHEN NOT MATCHED BY Source THEN
DELETE;

을 때 병합이 실행될 때,그것은 삽입없이 모든 데이터 어떤 오류가 있습니다.

enter image description here

새로운 데이터에 tb1:

enter image description here

을 실행할 때 Merge,그것은 나에게 같은 오류로 당신입니다.

enter image description here

문제 해결 방법으로 중 하나를 사용하여 아래 옵션

  1. 추가 조건은 가능한 경우에 절을 고유하게 식별하는 데이터입니다.

  2. 중복을 제거 에서 원본과 데이터를 병합으로서 tb2 아래와 같습니다.

     --temp table
     drop table if exists #tb1;
    
     select *  into #tb1 from (
         select *, row_number() over(partition by firstname, lastname order by firstname, lastname, updated_date desc) as rn from tb1) a
     where rn = 1 
    
     MERGE tb2 AS Target
     USING #tb1 AS Source
      ON Source.firstname = Target.firstname and 
         Source.lastname = Target.lastname 
    
     -- For Inserts
     WHEN NOT MATCHED BY Target THEN
     INSERT (firstname, lastname, updated_date) 
       VALUES (Source.firstname, Source.lastname, source.updated_date)
    
     -- For Updates
     WHEN MATCHED THEN UPDATE SET
        Target.updated_date     = Source.updated_date
    
     -- For Deletes
     WHEN NOT MATCHED BY Source THEN
       DELETE;
    

데이터 병합으로서 tb2 성공하였습니다.

enter image description here

2021-12-02 12:52:40

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................