2017-01-26 10 views
0

소스 테이블의 두 열을 비교하여 병합해야하는 문제가 있습니다. 동일하지 않은 경우 새 행으로 세 번째 테이블.SQL Server 병합 : 원본 테이블의 두 열이 같지 않다면 대상 테이블의 한 열에 새 레코드로 삽입하십시오.

소스 테이블 :

MIN_ID MAX_ID 
    1  1+ 
    4  2 
    3  3 
    3  1 
    4  1+ 

원하는 목표 테이블 : 그들은 동일 그 때보다 한 레코드 예로서 삽입하는 경우

MERGED_ID 
    1 
    1+ 
    4 
    2 
    3 
    3 
    1 
    4 
    1+ 

난 유사한 값을 삽입하는 병합을 사용하여 시도 동일한 수의 레코드를 대상 (Source.MIN_ID 또는 Source.MAX_ID)에 삽입 한 일치하지 않는 값

MERGE into [dbo].[Target] as A 
    USING 
     [dbo].[Source] as B 
     ON 
     (B.MIN_ID=B.MAX_ID) 

    WHEN MATCHED THEN 
    UPDATE SET A.MERGED_ID=B.MAX_ID 

WHEN NOT MATCHED THEN 
    INSERT 
     (A.MERGED_ID) 
VALUES 
     (B.MIN_ID) 
     ) 
     ; 
    GO 

이 레코드는 190 만 레코드를 삽입합니다 (대상에 소스와 동일) (MAX_ID가 아닌 경우 MIN_ID). 하지만 Source.MAX_ID 값을 Source.MIN_ID와 같지 않으면 Source.MAX_ID 값을 삽입해야하므로 무한 쿼리 (55 분 동안 쿼리를 종료 할 때까지 대상 테이블에 이미 190 만 개의 행이 있음)로 실행되는 유사한 병합을 작성했습니다. 처음 병합하는 데 13 초 걸렸습니다.

MERGE into [dbo].[Target] as A 
    USING 
     [dbo].[Source] as B 
     ON 
     (A.MERGED_ID=B.MAX_ID) 

    WHEN MATCHED THEN 
    UPDATE SET A.MERGED_ID=B.MAX_ID 

WHEN NOT MATCHED THEN 
    INSERT 
     (A.MERGED_ID) 
VALUES 
     (B.MAX_ID) 
     ) 
     ; 
    GO 

누군가 내가 잘못하고있는 것에 대해 조언 해 주실 수 있습니까?

+0

ON에서 술어를보십시오. 당신은 tableA를 참조하지 않고있다. 물론 당신은 실제 문제를 너무 모호하게하여이 문제가 더 이상 실제 문제에 대한 정확한 묘사가 아닌지 의심 스럽습니다. 그리고 때의 핵심은 무엇입니까? 값을 이미 설정된 값과 동일하게 설정합니다. 샘플 표가 동일한 값을 갖는 여러 행을 가진 단일 열이기 때문에 여기에서 실제로하려고하는 것을 완전히 이해할 수 없습니다. –

+0

대상 테이블은 처음에 비어 있습니다. 첫 번째 문장에서는 source.column1이 source.column2와 일치 할 때 target1을 column.column1에 삽입합니다. 일치하지 않으면 source.column1을 target.column1에 삽입하십시오. 두 번째 병합의 목적은 target.column1 = source.column2 일 때 source.column2 값으로 다시 업데이트합니다. 일치하지 않으면 이전에 건너 뛴 source.column2 값을 삽입합니다 (여기서 source.column1! = source.column2) –

+0

source.column1 = source.column2 일 때 대상 테이블을 발견하면 하나의 값만 유지됩니다. 값이 같지 않으면 두 값이 단일 열에 병합됩니다. –

답변

0

나 자신을 위해 더 간단한 방법으로 문제를 해결했습니다. 첫 번째 쿼리

  MERGE into [dbo].[Target] as A 
     USING 
     [dbo].[Source] as B 
      ON 
      (B.MAX_ID=A.MERGED_ID) 

     WHEN MATCHED THEN 
       UPDATE SET A.MERGED_ID=B.MAX_ID 

     WHEN NOT MATCHED THEN 
      INSERT 
       (A.MERGED_ID) 
      VALUES 
       (B.MIN_ID) 
      ; 
      GO 

다음과 같이 수정 그럼 난 190 만 원 기록 플러스 450K 추가 기록의 결과로 다른 필요한 값

INSERT INTO dbo.Target 
     (MERGED_ID) 

    SELECT B.MAX_ID  
     FROM dbo.Source as B 
     WHERE B.MIN_ID<>B.MAX_ID; 

을 채우는 SELECT INTO 문 간단한 INSERT를 사용하는 경우 소스 테이블의 두 열 같지 않음

+0

머지 (merge) 문은 머지 않아 엉망이되었습니다. 그러나 병합이 너무 거대하고 복잡하고 느리기 때문에 별도의 update/insert 문으로 되돌아갔습니다. 그래서 나는 당신의 솔루션 is_more_ 복잡하다고 말하지 않을 것이다 –

+0

나는 나 자신을 위해 물건을 더 단순하게 만든다는 것을 의미한다! 오식! –