我有这个源表用于合并,目标表具有相同的字段。
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
你有 重复 在您的来源上(基于
ID
,即您的 MERGE ON
列)。
您可以在源中使用分组,以便每个 ID
仅需要
一个值,或者您可以提前清理源,以便每个
ID
只包含一个记录。
您正在加入源表和目标表
(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);