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)
是否可以合并目标上的记录子集?
你当然可以做到这一点。您可以使用 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 将让您做您想做的事情。