簡體   English   中英

在 SQL Server 合並中使用多個匹配條件

[英]Using multiple match criteria in SQL server merge

此時源表和目標表具有三列“ID”、“ST”和“ADD”。 'ADD' 允許為空

在我想將源表中所做的更改放入目標中使用SQL Server 合並語句。 要求:

  1. 如果ID在源中可用但在目標中不可用,則在目標中插入新行
  2. 對於source 和 target 中可用的任何ID ,如果只有ADD是源中的更改,則在目標中插入新行。 即如果ID=2ADD更改了兩次,那么我們將在目標中為ID=2提供三行(原始 + 兩次更改),因為我們每次都插入新行
  3. 對於source 和 target 中可用的任何ID ,如果源中只有ST更改,則應在所有行中更新ST的修改值以匹配目標中的ID
  4. 對於source 和 target 中可用的任何ID ,如果STADD都在 source 中更改,則應為新ADD插入新行,並且應為該ID更新所有舊行,並使用ST更新

我可以通過 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值的更新並不像您描述的那樣。

  1. 對於源和目標中可用的任何 ID,如果源中只有 ST 更改,則應在所有行中更新 ST 的修改值以匹配目標中的 ID

由於上面的查詢加入(ID, ADD)ST的修改值不會在目標中匹配ID的所有行中更新,而是在具有匹配IDADD的一行中更新。

同樣,第四個要求也不是您想要的。 將插入新行,但不會更新具有相同ID的舊行。

對於這種ST更新,您需要單獨的UPDATE語句。 或者根本不使用MERGEINSERTUPDATE語句分開。

暫無
暫無

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

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