【发布时间】:2013-12-10 20:33:33
【问题描述】:
我正在使用 SQL Server 2008,并且正在尝试从暂存(源)表中加载新的(目标)表。目标表为空。
我认为由于我的目标表是空的,MERGE 语句会跳过 WHEN MATCHED 部分,即 INNER JOIN 的结果为 NULL,因此没有更新,它只是继续执行 WHEN NOT MATCHED BY TARGET 部分(LEFT OUTER JOIN) an 插入临时表中的所有记录。
我的目标表看起来与我的暂存表(第 1 行和第 4 行)完全相同。目标表中应该只有 3 行(第 4 行 3 次插入和 1 次更新)。所以,我不确定发生了什么。
FileID client_id account_name account_currency creation_date last_modified 210 12345 汽车 USD 2013-11-21 2013-11-27 211 23498 卡车 USD 2013-09-22 2013-11-27 212 97652 汽车 - 1 美元 2013-09-17 2013-11-27 210 12345 汽车 JPY 2013-11-21 2013-11-29
查询
MERGE [AccountSettings] AS tgt -- RIGHT TABLE
USING
(
SELECT * FROM [AccountSettings_Staging]
) AS src -- LEFT TABLE
ON src.client_id = tgt.client_id
AND src.account_name = tgt.account_name
WHEN MATCHED -- INNER JOIN
THEN UPDATE
SET
tgt.[FileID] = src.[FileID]
,tgt.[account_currency] = src.[account_currency]
,tgt.[creation_date] = src.[creation_date]
,tgt.[last_modified] = src.[last_modified]
WHEN NOT MATCHED BY TARGET -- left outer join: A row from the source that has no corresponding row in the target
THEN INSERT
(
[FileID],
[client_id],
[account_name],
[account_currency],
[creation_date],
[last_modified]
)
VALUES
(
src.[FileID],
src.[client_id],
src.[account_name],
src.[account_currency],
src.[creation_date],
src.[last_modified]
);
【问题讨论】:
-
@AaronBertrand 谢谢。除了 IF EXISTS,你建议用什么来代替它?
-
它现在是空的,但不会用于未来的工作运行。如果 MERGE 语句继续为任何帐户插入重复数据,则会导致问题。
-
你应该在问题中这么说。问题中的所有内容都让我相信这是某种一次性的事情,或者目标表总是首先被清除。
标签: sql sql-server sql-server-2008