使用数据子集作为MERGE的目标

时间:2018-04-10 17:53:46

标签: sql sql-server tsql sql-server-2012

目前,我们正在与import pandas as pd df1 = pd.read_excel('SnapshotID_Old.xlsx') df2 = pd.read_excel('SnapshotID_New.xlsx') difference = df1[df1.ne(df2)] print difference 合并:

esqlProductTarget

而不是与整个MERGE esqlProductTarget T USING esqlProductSource S ON (S.ProductID = T.ProductID) WHEN MATCHED THEN UPDATE SET T.Name = S.Name, T.ProductNumber = S.ProductNumber, T.Color = S.Color WHEN NOT MATCHED BY TARGET THEN INSERT (ProductID, Name, ProductNumber, Color) VALUES (S.ProductID, S.Name, S.ProductNumber, S.Color) WHEN NOT MATCHED BY SOURCE THEN DELETE; 目标数据集合并,我们可以合并这样的子集:

esqlProductTarget

是否可以合并目标上的记录子集?

2 个答案:

答案 0 :(得分:1)

你当然可以这样做。您可以使用CTE作为MERGE的来源或目标。

WITH ePT AS
(
  SELECT
    *
  FROM 
    esqlProductTarget 
  WHERE productid > 1000
)
MERGE ePT AS T
USING esqlProductSource AS S
ON (S.ProductID = T.ProductID)
WHEN MATCHED 
     THEN UPDATE
     SET    T.Name = S.Name,
            T.ProductNumber = S.ProductNumber,
            T.Color = S.Color
WHEN NOT MATCHED BY TARGET
THEN INSERT (ProductID, Name, ProductNumber, Color)
     VALUES (S.ProductID, S.Name, S.ProductNumber, S.Color)
WHEN NOT MATCHED BY SOURCE
THEN DELETE;

现在,当然,如果您尝试在少于1000的productID中使用MERGE,那么您将遇到麻烦,但如果您对数据充满信心,那么SQL将让您按照自己的意愿行事。

答案 1 :(得分:0)

根据文件(https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql

  

target_table是数据行所针对的表或视图    基于匹配。   target_table是任何插入,更新或删除操作的目标   由MERGE声明的WHEN条款规定。

因此,如果您不想对表进行合并,则必须创建一个视图来表示您的子集。但这可能不会提供任何类型的性能优势,所以如果您关心的是性能,那么您可能只是坚持与表合并或分成单独的更新和插入语句。