簡體   English   中英

MERGE 語句更新或插入行到表中

[英]MERGE statement to update or insert rows into a table

我的任務是在 table2 中插入或更新行。 表 1 包含所有員工的 ID。 該 id 與 table2 中的 ID 匹配。 table2 中的一些員工已經有了我需要的行,但有些沒有。 表 2 不包含沒有這些行的員工的 ID。

我的任務是更新現有 ID 的行並插入沒有這些行的行。

我試過以下聲明:

MERGE INTO dbo.table2 AS TGT
USING (SELECT table1ID FROM dbo.table1) AS SRC
      ON SRC.table1ID = TGT.table2ID

WHEN MATCHED 
     AND table2Code = 'ValueToInsertOrUpdateCode'
    THEN
       UPDATE 
       SET table2Value= 'ValueToInsertOrUpdateValue'

WHEN NOT MATCHED BY TARGET 
    THEN
        INSERT (table2Code, table2ID, table2Value)
        VALUES ('ValueToInsertOrUpdateCode', src.table1ID, 'ValueToInsertOrUpdateValue'); 

這目前只更新存在的行,但不會插入沒有現有行的 ID 的行。

老實說,我會建議避免使用MERGE運算符,而是在此處執行 Upsert。 對於您的場景,您最有可能需要以下內容:

SET XACT_ABORT ON;
BEGIN TRANSACTION;

UPDATE T2 WITH (UPDLOCK, SERIALIZABLE) 
SET table2Value = 'ValueToInsertOrUpdateValue'
FROM dbo.Table2 T2
     JOIN dbo.Table1 T1 ON T1.table1ID = T2.table2ID;
-- You could honestly use an EXISTS here, considering that you're updating the table
-- with a literal, rather than a value from the table Table1.

INSERT INTO dbo.Table2 (table2Code , table2ID, table2Value)
SELECT 'ValueToInsertOrUpdateCode',
       T1.table1ID,
       'ValueToInsertOrUpdateValue'
FROM dbo.Table1 T1
WHERE NOT EXISTS (SELECT 1
                  FROM dbo.Table2 T2
                  WHERE T2.table2ID = T1.table1ID);

COMMIT;

數據庫<>小提琴

根據您的評論,聽起來您想要這樣,以便執行WHEN NOT MATCHED BY TARGET

MERGE INTO dbo.table2 AS TGT
USING (SELECT table1ID FROM dbo.table1) AS SRC
      ON (SRC.table1ID = TGT.table2ID AND table2Code = 'ValueToInsertOrUpdateCode') -- This is the difference

WHEN MATCHED 
     AND table2Code = 'ValueToInsertOrUpdateCode'
    THEN
       UPDATE 
       SET table2Value= 'ValueToInsertOrUpdateValue'

WHEN NOT MATCHED BY TARGET 
    THEN
        INSERT (table2Code, table2ID, table2Value)
        VALUES ('ValueToInsertOrUpdateCode', src.table1ID, 'ValueToInsertOrUpdateValue'); 

SRC.table1ID = TGT.table2ID (即它們匹配)時, WHEN NOT MATCHED BY TARGET將不會執行。

ON子句更新為ON (SRC.table1ID = TGT.table2ID AND table2Code = 'ValueToInsertOrUpdateCode')將為您提供您期望的插入。

但是你可能不應該這樣做:
ON <merge_search_condition> 注意事項

僅指定目標表中用於匹配目的的列很重要。 也就是說,指定目標表中與源表的相應列進行比較的列。 不要試圖通過在 ON 子句中過濾掉目標表中的行來提高查詢性能; 例如,指定 AND NOT target_table.column_x = value。 這樣做可能會返回意外和不正確的結果。

出於這個原因以及其他人的建議,執行單獨的更新和插入語句會更安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM