SQL SERVER MERGE 错误

问题描述 投票:0回答:2

我有这个源表用于合并,目标表具有相同的字段。

ID       Name           Birth            Work
123      john doe       01/20/2000       plumber
123      john doe       01/20/2000       carpenter
234      john ere       12/12/1990       driver
345      john wel       02/21/1998       janitor

但是当我尝试使用 Merge 语句从源传输数据时,它会提示“主键重复”之类的错误,有时会提示“由于已更新一次而无法更新数据”。如何避免这些错误?

我想要做的是,在我的源表中,它充当工人(历史)的入场,我的目标数据是主列表。谁能帮助我如何避免这个错误?

这是我的询问:

MERGE EMPMASTER  as T
USING (Select ID,Name,Birth,Work from ADMISSION) as S
ON (CAST(T.IDNum as int)=Cast(S.ID as int))
WHEN NOT MATCHED by TARGET
THEN
INSERT (IDNum,EMPName,EMPBirth,EMPWork)

Values (ID,Name,Birth,Work)

WHEN MATCHED  THEN

UPDATE Set IDNum=ID,
           EMPName=Name,
           EMPBirth=Birth,
           EMPWork=Work);

所以在我的主列表表中它看起来像:

ID       Name           Birth            Work
    123      john doe       01/20/2000       carpenter
    234      john ere       12/12/1990       driver
    345      john wel       02/21/1998       janitor
sql sql-server-2008
2个回答
2
投票

你有 重复 在您的来源上(基于

ID
,即您的
MERGE ON
列)。

您可以在源中使用分组,以便每个 ID 仅需要

一个值
,或者您可以提前清理源,以便每个
ID
只包含一个记录。


0
投票

您正在加入源表和目标表

(CAST(T.IDNum as int)=Cast(S.ID as int))

在您的源数据样本中,有超过 1 行具有相同的

ID (123)

由于您的源表和目标表具有相同的字段,因此您也可以使用“工作”字段进行连接,以便过滤连接组合中的唯一记录。下面是查询

MERGE EMPMASTER  as T
USING (Select ID,Name,Birth,Work from ADMISSION) as S
ON (CAST(T.IDNum as int)=Cast(S.ID as int))
and (CAST(T.EMPWork as varchar)=Cast(S.Work as varchar))
WHEN NOT MATCHED by TARGET
THEN
INSERT (IDNum,EMPName,EMPBirth,EMPWork)

Values (ID,Name,Birth,Work)

WHEN MATCHED  THEN

UPDATE Set IDNum=ID,
           EMPName=Name,
           EMPBirth=Birth,
           EMPWork=Work);
© www.soinside.com 2019 - 2024. All rights reserved.