1

2つのテーブルがあると仮定します:Remote_tableMy_table

Remote_table6つの列があります:

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_tableのコピーですremote_table

remote_tableこのクエリによって、から新しいレコードのみをコピーしようとしました。

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

remote_table正常に動作しますが、[時間]列に変更が加えられると、重複する主キーの例外が発生します。

誰かが新しいレコードのみをコピーしremote_table、古いレコードに変更が加えられている場合は、それらを識別しmy_tableて対応するように更新する方法を考えられますか?

4

3 に答える 3

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ステートメントにはありませんでした。INTO TableNameMERGE
于 2012-10-09T09:41:57.093 に答える
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);  
于 2012-10-09T09:47:54.057 に答える
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 
于 2012-10-09T09:35:52.267 に答える