![](/img/trans.png)
[英]Match records in 2 mutually distinct tables based on multiple criteria using SQL
[英]Using multiple match criteria in SQL server merge
此時源表和目標表具有三列“ID”、“ST”和“ADD”。 'ADD' 允許為空
在我想將源表中所做的更改放入目標中使用SQL Server 合並語句。 要求:
我可以通過 SQL Server 合並來實現這一點嗎? 如果沒有,我們有什么替代方案?
嘗試將 st 合並為唯一列並更新 id,添加具有多條記錄的列
MERGE Tablex AS TARGET
USING Vw_tablex AS SOURCE
ON (TARGET.id = SOURCE.id)
WHEN MATCHED
AND
--updates only St column as unique
target.st <> source.st
THEN
UPDATE
SET
--- Inserts/updates multiple values in add column
TARGET.id = SOURCE.id
,TARGET.ADD = Source.ADD
,TARGET.st = SOURCE.st
WHEN NOT MATCHED BY TARGET
THEN
INSERT (
id
,ADD
,st
)
VALUES (
SOURCE.id
,source.ADD
,source.st
);
MERGE
需要主鍵,您必須以使行一對一匹配的方式連接兩個表。 否則你會得到類似這樣的錯誤:
MERGE 語句多次嘗試更新或刪除同一行。 當目標行匹配多個源行時會發生這種情況。 MERGE 語句不能多次 UPDATE/DELETE 目標表的同一行。 優化 ON 子句以確保目標行最多匹配一個源行,或使用 GROUP BY 子句對源行進行分組。
您的第二個要求實質上意味着該鍵由兩列(ID, ADD)
組成,並且MERGE
語句應在兩列上連接:
MERGE INTO DstTable AS Dst
USING
(
SELECT
ID
,ST
,ADD
FROM SrcTable
) AS Src
ON Dst.ID = Src.ID
AND Dst.ADD = Src.ADD
WHEN MATCHED AND Dst.ST <> Src.ST THEN
UPDATE SET
Dst.ST = Src.ST
WHEN NOT MATCHED BY TARGET THEN
INSERT
(ID
,ST
,ADD)
VALUES
(ID
,ST
,ADD)
;
該查詢幾乎可以滿足您的需求。 ST
值的更新並不像您描述的那樣。
- 對於源和目標中可用的任何 ID,如果源中只有 ST 更改,則應在所有行中更新 ST 的修改值以匹配目標中的 ID
由於上面的查詢加入(ID, ADD)
, ST
的修改值不會在目標中匹配ID
的所有行中更新,而是在具有匹配ID
和ADD
的一行中更新。
同樣,第四個要求也不是您想要的。 將插入新行,但不會更新具有相同ID
的舊行。
對於這種ST
更新,您需要單獨的UPDATE
語句。 或者根本不使用MERGE
將INSERT
和UPDATE
語句分開。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.