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

l--*_*''' 4 sql t-sql sql-server sql-server-2012

目前,我们正在合并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;
Run Code Online (Sandbox Code Playgroud)

esqlProductTarget我们可以像这样针对子集进行合并,而不是针对整个目标数据集进行合并:

MERGE (select * from esqlProductTarget where productid>1000) --the only change here is this line
USING esqlProductSource S
--etc
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ndt 7

你当然可以做到这一点。您可以使用 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;
Run Code Online (Sandbox Code Playgroud)

当然,现在如果您尝试在小于 1000 的 ProductID 中进行 MERGE,您会遇到麻烦,但如果您对自己的数据充满信心,SQL 将让您做您想做的事情。