2011-02-16 164 views
0

我有從源表中將數據加載到目標表的情況。如果來自源的數據不在目標中,那麼我需要插入。如果它已經存在於目標表中,則將該行的狀態更新爲'過期'並將該列作爲新行插入。我用合併查詢來做到這一點。如果不存在,我可以插入,我也可以更新。但在匹配時嘗試插入時,它表示在'when matched'子句中不允許插入。 請幫我..謝謝提前在SQL Server 2008中合併查詢

+0

告訴我們你已經擁有的!並解釋你的桌子是什麼樣的! –

回答

0

如果您想對單行的源數據執行多個操作,您需要以某種方式複製該行。

類似以下(佔表名稱等):

;WITH Source as (
    SELECT Col1,Col2,Col3,t.Dupl 
    FROM SourceTable,(select 0 union all select 1) t(Dupl) 
) 
MERGE INTO Target t 
USING Source s ON t.Col1 = s.Col1 and s.Dupl=0 /* Key columns here */ 
WHEN MATCHED THEN UPDATE SET Expired = 1 
WHEN NOT MATCHED AND s.Dupl=1 THEN INSERT (Col1,Col2,Col3) VALUES (s.Col1,s.Col2,s.Col3); 

你總是希望在不匹配的分支s.Dupl條件,否則源行不匹配任何目標行將被插入兩次。


從您發佈的評論的例子,我會改變:

MERGE target AS tar USING source AS src ON src.id = tar.id 
WHEN MATCHED THEN UPDATE SET [email protected], C_IS_ACTIVE='N', [email protected] 
WHEN NOT MATCHED THEN INSERT (col1,col2,col3) VALUES (tar.col1,tar.col2,tar.col3); 

到:

;WITH SourceDupl AS (
    SELECT id,col1,col2,col3,t.Dupl 
    FROM source,(select 0 union all select 1) t(Dupl) 
) 
MERGE target AS tar USING SourceDupl as src on src.id = tar.id AND Dupl=0 
WHEN MATCHED THEN UPDATE SET [email protected], C_IS_ACTIVE='N', [email protected] 
WHEN NOT MATCHED AND Dupl=1 THEN INSERT (col1,col2,col3) VALUES (src.col1,src.col2,src.col3); 

我的VALUES子句中更改的值,因爲在一個NOT MATCHED分支,tar表沒有一行可以從中選擇值。

+0

當我第一次插入數據時,可以執行'WHEN NOT MATCHED'。在下一次,當數據存在時,它執行更新,並且對於Insert,您希望我使用之前聲明的相同'WHEN NOT MATCHED'子句執行更新。合併是否會允許2'WHEN NOT MATCHED'子句。我能做些什麼來區分'WHEN NOT MATCHED'條款 –

+0

@ user549903 - 我不確定你現在要求什麼。在我展示的陳述中,如果目標表中有匹配的行,UPDATE和INSERT都會發生。 –

+0

MERGE目標AS目標使用源AS src ON src.id = tar.id WHEN MATCHED THEN UPDATE SET D_VALID_TO = @ nowdate-1,C_IS_ACTIVE ='N',D_LAST_UPDATED_DATE = @ nowdate WHEN NOT MATCHED THEN INSERT(col1,col2, col3) VALUES(tar.col1,tar.col2,tar.col3); –