2012-10-09 3 views
1

Remote_tableMy_table의 두 테이블이 있다고 가정합니다.데이터 테이블에서 새 레코드 복사 및 이전 레코드의 변경 확인

PROJECT JOB_TYPE MONTH YEAR**  HOURS  IS_DELETED 
134393  70   1  2013  30  0 
134393  70   2  2013  50  0 
134393  70   3  2013  80  0 
134393  70   10  2012  10  0 
134393  70   11  2012  0  0 
134393  70   12  2012  15  0 

My_tableremote_table의 사본이다

Remote_table 6 열을 갖는다.

나는이 쿼리에 의해 remote_table 만 새로운 기록을 복사하려고 :

SELECT * 
FROM [remote_DB].[LudanProjectManager].[dbo].Remote_table    
EXCEPT   
SELECT * 
FROM My_table 

그것은 확인을 작동하지만 변화가 시간 컬럼에 remote_table에서 작성되었을 때 중복 기본 키 예외를 얻을.

누구나 remote_table에서 새 레코드 만 복사하고 이전 레코드가 변경된 경우 해당 레코드를 식별하고 my_table을 업데이트 할 수 있습니까?

+0

당신은 Upsert을 시도하거나 문을 병합 할 수 있습니다. –

+0

아마도 'EXCEPT'대신 'exist in'을 사용해야합니다. EXCEPT 명령은 모든 열을 비교하므로 시간 열에 업데이트가있을 때 중복 키를 가져 오는 것입니다. – Romo

답변

2

는 SQL Server 2008을 사용하고 있기 때문에, 당신은 MERGE 사용할 수 있습니다

MERGE INTO My_table AS TGT 
USING Remote_table AS SRC 
    ON TGT.PROJECT = SRC.PROJECT, -- This is the matching condition. 
    TGT.YEAR = SRC.YEAR, 
    --- 
WHEN NOT MATCHED THEN 
    INSERT(PROJECT, JOB_TYPE, MONTH, YEAR, HOURS, IS_DELETED) 
    VALUES(SRC.PROJECT, SRC.JOB_TYPE, SRC.MONTH, SRC.YEAR, SRC.HOURS, 
     SRC.IS_DELETED); 

참고 :

  • 일치하는 행과 일치하지 않는 행은 ON 절에 지정된 코드를 기반으로 결정되며 , TGT.Year = SRC.TGT, ..이라는 추가 조건을 사용하여 일치하는 행을 제한하거나 PROJECT 필드에서만 ON TGT.PROJECT = SRC.PROJECT을 사용하여 일치시킬 수 있습니다.
  • MEREGE 문을 세미콜론으로 끝내야합니다. 그것은 필수입니다.
  • INSERT 문에는 대상 테이블의 이름이 MERGE 절에 이미 정의되어 있기 때문에 INTO TableName이 없었습니다.
+0

여기에 일치하면 업데이트해야하고 일치하지 않을 때는 새 레코드로 삽입하십시오 – AnandPhadke

+0

@AnandPhadke 미안 해요. 지금 수정 됨 –

0

새로운 식별 :

SELECT * FROM [remote_DB].[LudanProjectManager].[dbo].Remote_table RT 
WHERE NOT EXISTS 
(
    SELECT 1 FROM My_table MT WHERE MT.PROJECT=RT.PROJECT 
) 

를 확인 변경 :

SELECT * FROM [remote_DB].[LudanProjectManager].[dbo].Remote_table RT 
INNER JOIN My_table MT ON RT.PROJECT=MT.PROJECT 
WHERE RT.JOB_TYPE <> MT.OB_TYPE 
OR RT.MONTH  <> MT.MONTH 
OR RT.YEAR  <> MT.YEAR 
OR RT.HOURS  <> MT.HOURS 
OR RT.IS_DELETED <> MT.IS_DELETED 
1

이 시도 :

MERGE INTO My_table T 
USING 
    Remote_table R 
    ON T.PROJECT = R.PROJECT 
WHEN MATCHED THEN 
    UPDATE SET 
     T.JOB_TYPE=R.JOB_TYPE 
     T.MONTH =R.MONTH 
     T.YEAR =R.YEAR 
     T.HOURS =R.HOURS 
     T.IS_DELETED=R.IS_DELETED 
WHEN NOT MATCHED THEN 
    INSERT (T.PROJECT,T.JOB_TYPE,T.MONTH,T.YEAR,T.HOURS,T.IS_DELETED) 
    VALUES (R.PROJECT,R.JOB_TYPE,R.MONTH,R.YEAR,R.HOURS,R.IS_DELETED); 
관련 문제