2012-01-27 69 views
0

我想從源執行MERGE到目標插入行,如果它們不存在並更新那些。當我這樣做時,我只得到插入...沒有更新。我閱讀這篇文章(http://stackoverflow.com/questions/5015623/merge-query-in-sql-server-2008),這有點讓我感到困惑,但似乎我需要一個重複的來源做到這一點。有人可以解釋爲什麼需要DUPLICATE源代碼?我只是不明白它,尤其是我應該使用哪些鍵(重複的源或常規的) - 也許重複的SourceTable不需要?SQL Server 2008 MERGE與目標無關的表格

這裏我(簡體)sourceTable會:

row userid placervalue placerDt 
    --- ------- ---------- ---------- 
    1  abc  a1   1/1/12 
    2  xyz  b1   1/1/12 
    3  abc  b2   1/20/12 
    etc. 

和我的目標TargetTable是相同的,但目前正與它沒有行。

row userid placerId 
    --- ------- ---------- 
    (nothing loaded yet) 

我想要的是插入不在目標行中的行,以及UPDATE行。

row userid placervalue placerDt 
    --- ------- ---------- ---------- 
    1  abc  a1   1/20/12 *** note change here (row 3 updates row 1) 
    2  xyz  b1   1/1/12 

當我運行這段代碼,我只得到插件(也想知道爲什麼)

MERGE TargetTable as t 
USING SourceTable as s 
    ON s.userid = t.usrid AND s.placervalue = t.placervalue 
WHEN MATCHED THEN 
    UPDATE 
     SET t.placerDt = s.placerDt 
WHEN NOT MATCHED THEN 
    INSERT (
     userid 
    , placerid 
    , placerDt 
    ) VALUES (
     s.userid 
    , s.placerid 
    , s.placerDt 
    ); 

回答

1

如果你沒有在你的目標表行,沒有什麼比賽,這就是爲什麼你只能得到插入。

運行查詢,你應該有更新

+1

擴大對迭戈的回答第二次 - 邏輯只適用於執行之前合併,而不是在表中部分數據是在表中的數據您可以創建一個視圖,該視圖只返回最近的有效行(根據您指定的任何標準)以及用作合併源的用途。 – 2012-01-27 16:19:57

+0

我在某處讀到MERGE是一套操作---這是什麼意思?以另一種方式提出這個問題:如果record1是一個INSERT,並且如果record2與record1匹配,那麼SQL Server會看到record1現在在記錄中並且我得到了記錄1的UPDATE?或者我在下一次嘗試合併(因爲它是在整套設備上運行)而獲得更新?我發現的帖子似乎暗示MERGE可以逐行操作。 – user991945 2012-01-27 16:24:49

+0

想像從源複製到目的地的合併,但是如果該行已經存在於目的地中,它將被更新而不是被複制 – Diego 2012-01-27 16:28:35