簡體   English   中英

SQL 合並到多個語句

[英]SQL Merge Into with multiple statements

我正在嘗試保留另一個歷史表。 更新原始數據時,我想將行插入到歷史數據中。 我正在使用 Sql 合並:

MERGE TargetProducts AS Target
USING SourceProducts    AS Source
ON Source.ProductID = Target.ProductID
    
-- For Inserts
WHEN NOT MATCHED BY Target THEN
    INSERT (ProductID,ProductName, Price) 
    VALUES (Source.ProductID,Source.ProductName, Source.Price)
    
-- For Updates
WHEN MATCHED THEN UPDATE SET
    Target.ProductName  = Source.ProductName,
    Target.Price        = Source.Price
    
-- For Deletes
WHEN NOT MATCHED BY Source THEN
    DELETE;

我可以在同一個“ when ”條件下進行多條語句嗎?例如:

...
-- For Inserts
WHEN NOT MATCHED BY Target THEN
    INSERT (ProductID,ProductName, Price) VALUES (Source.ProductID,Source.ProductName, Source.Price);
    INSERT INTO anotherTable (OldProductID,OldProductName, OldPrice) VALUES (Source.ProductID,Source.ProductName, Source.Price);
...

通常您只能INSERT到一張表中。 該語法不允許在同一個“when”條件下使用多個語句。

但是,SQL 服務器有OUTPUT子句允許添加另一個表。 當您需要某種審計跟蹤時,它非常方便。

看到這個問題How to INSERT into multiple tables from a SELECT statement

因此,將OUTPUT子句添加到您的MERGE語句中。 像這樣的東西:

MERGE TargetProducts AS Target
USING SourceProducts    AS Source
ON Source.ProductID = Target.ProductID
    
-- For Inserts
WHEN NOT MATCHED BY Target THEN
    INSERT (ProductID,ProductName, Price) 
    VALUES (Source.ProductID,Source.ProductName, Source.Price)
    
-- For Updates
WHEN MATCHED THEN UPDATE SET
    Target.ProductName  = Source.ProductName,
    Target.Price        = Source.Price
    
-- For Deletes
WHEN NOT MATCHED BY Source THEN
    DELETE

OUTPUT inserted.ProductID, inserted.ProductName, inserted.Price
INTO anotherTable (OldProductID,OldProductName, OldPrice)
;

這將捕獲anotherTable中的更新和插入。 要僅捕獲插入,您可以首先將 output 放入臨時表中,然后通過 MERGE $action過濾結果。

看看這個問題:

DBMS 級別的管道和過濾器:拆分 MERGE output stream

暫無
暫無

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

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