[英]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.