소스 테이블의 두 열을 비교하여 병합해야하는 문제가 있습니다. 동일하지 않은 경우 새 행으로 세 번째 테이블.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
누군가 내가 잘못하고있는 것에 대해 조언 해 주실 수 있습니까?
ON에서 술어를보십시오. 당신은 tableA를 참조하지 않고있다. 물론 당신은 실제 문제를 너무 모호하게하여이 문제가 더 이상 실제 문제에 대한 정확한 묘사가 아닌지 의심 스럽습니다. 그리고 때의 핵심은 무엇입니까? 값을 이미 설정된 값과 동일하게 설정합니다. 샘플 표가 동일한 값을 갖는 여러 행을 가진 단일 열이기 때문에 여기에서 실제로하려고하는 것을 완전히 이해할 수 없습니다. –
대상 테이블은 처음에 비어 있습니다. 첫 번째 문장에서는 source.column1이 source.column2와 일치 할 때 target1을 column.column1에 삽입합니다. 일치하지 않으면 source.column1을 target.column1에 삽입하십시오. 두 번째 병합의 목적은 target.column1 = source.column2 일 때 source.column2 값으로 다시 업데이트합니다. 일치하지 않으면 이전에 건너 뛴 source.column2 값을 삽입합니다 (여기서 source.column1! = source.column2) –
source.column1 = source.column2 일 때 대상 테이블을 발견하면 하나의 값만 유지됩니다. 값이 같지 않으면 두 값이 단일 열에 병합됩니다. –