2012-10-09 63 views
1

假設有兩個表:Remote_tableMy_table從數據表複製新記錄並識別舊記錄中的更改

Remote_table有6列:

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新記錄:

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

它的工作原理確定的,但我得到一個重複的主鍵異常修改時已對remote_table在小時柱提出。

任何人都可以想辦法從remote_table只複製新記錄,如果已更改舊記錄,識別它們並更新my_table以符合?

+0

您可以嘗試的Upsert或合併聲明。 –

+0

也許你應該使用'存在'而不是EXCEPT。 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, ..來限制匹配行,或者僅使用ON TGT.PROJECT = SRC.PROJECTPROJECT字段上匹配。
  • 您必須用分號結束MEREGE聲明。這是強制性的。
  • INSERT聲明中沒有INTO TableName,因爲目標表的名稱已在MERGE子句中定義。
+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);