Sql server 如何确保在SQL Server中执行合并期间插入时不匹配?

Sql server 如何确保在SQL Server中执行合并期间插入时不匹配?,sql-server,merge,Sql Server,Merge,我试图对一个表执行合并,得到一个无法在object中插入重复键行的错误。它表示重复的键值是(190101011901010100336461440000000002,A) 我有一张有两个键的桌子: [FA唯一列表标识符-参考ID],[Add,Change,Delete Indicator] [FA唯一列表标识符-参考ID]是主键,[Add,Change,Delete Indicator]包含值的“A”、“C”和“D”***注意,此指示器不适用于我的表格。它被认为是我的表的数据,但值“D”除外,它

我试图对一个表执行合并,得到一个
无法在object
中插入重复键行的错误。它表示重复的键值是(190101011901010100336461440000000002,A)

我有一张有两个键的桌子:
[FA唯一列表标识符-参考ID]
[Add,Change,Delete Indicator]

[FA唯一列表标识符-参考ID]
是主键,
[Add,Change,Delete Indicator]
包含值的“A”、“C”和“D”***注意,此指示器不适用于我的表格。它被认为是我的表的数据,但值“D”除外,它意味着从我的表中删除记录

我的规则很简单:如果
[Add,Change,Delete Indicator]
等于'D',从表中删除,否则,向上插入

这是我的密码:

MERGE PROPERTY.DBO.MLS AS T
USING STAGE.DBO.STAGE_MLS AS S
ON (T.[FA Unique Listing Identifier - Ref ID] = S.[FA Unique Listing Identifier - Ref ID])
WHEN MATCHED AND S.[Add, Change, Delete Indicator] <> 'D'
    THEN UPDATE 
    SET T.[Property Address] = S.[Property Address]
,T.[Property City] = S.[Property City]
,T.[Property State] = S.[Property State]
,T.[Property Zip] = S.[Property Zip]
,T.[Property Zip + 4] = S.[Property Zip + 4]
,T.[StreetNum] = S.[StreetNum]
,T.[Direction] = S.[Direction]
,T.[Street_Name] = S.[Street_Name]
,T.[Street_Type] = S.[Street_Type]
,T.[Post_Direction] = S.[Post_Direction]
,T.[Unit] = S.[Unit]
,T.[Street_Name_Post] = S.[Street_Name_Post]
,T.[Assessor's Parcel Identification Number] = S.[Assessor's Parcel Identification Number]
,T.[County FIPS] = S.[County FIPS]
,T.[Internal FA Property Ref ID] = S.[Internal FA Property Ref ID]
,T.[Property Type] = S.[Property Type]
,T.[Property Sub-Type] = S.[Property Sub-Type]
,T.[FA Calculated Days on Market] = S.[FA Calculated Days on Market]
,T.[Current Original Listing Date] = S.[Current Original Listing Date]
,T.[Listing Number] = S.[Listing Number]
,T.[Status] = S.[Status]
,T.[Status Sub Type] = S.[Status Sub Type]
,T.[Rental Indicator] = S.[Rental Indicator]
,T.[Current Listing Price] = S.[Current Listing Price]
,T.[Sold Price] = S.[Sold Price]
,T.[Sold Date] = S.[Sold Date]
,T.[FA Adjusted Sold Price] = S.[FA Adjusted Sold Price]
,T.[FA Sold Price Range] = S.[FA Sold Price Range]
,T.[Listing Agent License Number] = S.[Listing Agent License Number]
,T.[Listing Agent Name] = S.[Listing Agent Name]
,T.[Listing Agent Address] = S.[Listing Agent Address]
,T.[Listing Agent Phone] = S.[Listing Agent Phone]
,T.[Listing Agent Email] = S.[Listing Agent Email]
,T.[Office Name] = S.[Office Name]
,T.[Office Address] = S.[Office Address]
,T.[Office Phone] = S.[Office Phone]
,T.[Office Email] = S.[Office Email]
,T.[Listing Tracking ID] = S.[Listing Tracking ID]
,T.[FA Unique Listing Identifier - Ref ID] = S.[FA Unique Listing Identifier - Ref ID]
,T.[Update Timestamp] = S.[Update Timestamp]
,T.[Agent_SK] = HASHBYTES('MD5', S.[Listing Agent License Number] + '~' + S.[Listing Agent Name]
        + '~' + S.[Listing Agent Address] + '~' + S.[Listing Agent Phone]
        + '~' + S.[Listing Agent Email])
,T.[Add, Change, Delete Indicator] = S.[Add, Change, Delete Indicator]
,T.LoadDate = GETDATE()
WHEN NOT MATCHED AND S.[Add, Change, Delete Indicator]  <> 'D'
    THEN INSERT
            ([Property Address]
,[Property City]
,[Property State]
,[Property Zip]
,[Property Zip + 4]
,[StreetNum]
,[Direction]
,[Street_Name]
,[Street_Type]
,[Post_Direction]
,[Unit]
,[Street_Name_Post]
,[Assessor's Parcel Identification Number]
,[County FIPS]
,[Internal FA Property Ref ID]
,[Property Type]
,[Property Sub-Type]
,[FA Calculated Days on Market]
,[Current Original Listing Date]
,[Listing Number]
,[Status]
,[Status Sub Type]
,[Rental Indicator]
,[Current Listing Price]
,[Sold Price]
,[Sold Date]
,[FA Adjusted Sold Price]
,[FA Sold Price Range]
,[Listing Agent License Number]
,[Listing Agent Name]
,[Listing Agent Address]
,[Listing Agent Phone]
,[Listing Agent Email]
,[Office Name]
,[Office Address]
,[Office Phone]
,[Office Email]
,[Listing Tracking ID]
,[FA Unique Listing Identifier - Ref ID]
,[Update Timestamp]
,[Agent_SK]
,[Add, Change, Delete Indicator]
,LoadDate)
    VALUES
        (S.[Property Address]
,S.[Property City]
,S.[Property State]
,S.[Property Zip]
,S.[Property Zip + 4]
,S.[StreetNum]
,S.[Direction]
,S.[Street_Name]
,S.[Street_Type]
,S.[Post_Direction]
,S.[Unit]
,S.[Street_Name_Post]
,S.[Assessor's Parcel Identification Number]
,S.[County FIPS]
,S.[Internal FA Property Ref ID]
,S.[Property Type]
,S.[Property Sub-Type]
,S.[FA Calculated Days on Market]
,S.[Current Original Listing Date]
,S.[Listing Number]
,S.[Status]
,S.[Status Sub Type]
,S.[Rental Indicator]
,S.[Current Listing Price]
,S.[Sold Price]
,S.[Sold Date]
,S.[FA Adjusted Sold Price]
,S.[FA Sold Price Range]
,S.[Listing Agent License Number]
,S.[Listing Agent Name]
,S.[Listing Agent Address]
,S.[Listing Agent Phone]
,S.[Listing Agent Email]
,S.[Office Name]
,S.[Office Address]
,S.[Office Phone]
,S.[Office Email]
,S.[Listing Tracking ID]
,S.[FA Unique Listing Identifier - Ref ID]
,S.[Update Timestamp]
,HASHBYTES('MD5', S.[Listing Agent License Number] + '~' + S.[Listing Agent Name]
        + '~' + S.[Listing Agent Address] + '~' + S.[Listing Agent Phone]
        + '~' + S.[Listing Agent Email])
,S.[Add, Change, Delete Indicator]
,GETDATE())
WHEN MATCHED AND S.[Add, Change, Delete Indicator] = 'D'
    THEN DELETE;
将PROPERTY.DBO.MLS合并为T
使用STAGE.DBO.STAGE_MLS作为
ON(T.[FA唯一列表标识符-参考ID]=S.[FA唯一列表标识符-参考ID])
当与S匹配时[添加、更改、删除指示符]'D'
然后更新
设置T.[属性地址]=S.[属性地址]
,T.[Property City]=S.[Property City]
,T.[属性状态]=S.[属性状态]
,T.[Property Zip]=S.[Property Zip]
,T.[Property Zip+4]=S.[Property Zip+4]
,T.[StreetNum]=S.[StreetNum]
,T[方向]=S[方向]
,T.[街道名称]=S.[街道名称]
,T.[街道类型]=S.[街道类型]
,T.[Post_方向]=S.[Post_方向]
,T.[单位]=S.[单位]
,T.[Street\u Name\u Post]=S.[Street\u Name\u Post]
,T.[评估员的包裹识别号]=s.[评估员的包裹识别号]
,T.[County FIPS]=S.[County FIPS]
,T.[内部固定资产属性参考ID]=S.[内部固定资产属性参考ID]
,T.[属性类型]=S.[属性类型]
,T.[属性子类型]=S.[属性子类型]
,T.[FA计算市价天数]=S.[FA计算市价天数]
,T.[当前原始上市日期]=S.[当前原始上市日期]
,T.[上市编号]=S.[上市编号]
,T.[Status]=S.[Status]
,T.[状态子类型]=S.[状态子类型]
,T.[租金指标]=S.[租金指标]
,T.[当前上市价格]=S.[当前上市价格]
,T[售价]=S[售价]
,T[出售日期]=S[出售日期]
,T.[FA调整后的售价]=S.[FA调整后的售价]
,T.[FA售价范围]=S.[FA售价范围]
,T.[上市代理许可证号码]=S.[上市代理许可证号码]
,T.[Listing Agent Name]=S.[Listing Agent Name]
,T.[上市代理地址]=S.[上市代理地址]
,T.[Listing Agent Phone]=S.[Listing Agent Phone]
,T.[上市代理电子邮件]=S.[上市代理电子邮件]
,T.[办公室名称]=S.[办公室名称]
,T[办公地址]=S[办公地址]
,T[办公电话]=S[办公电话]
,T.[办公室电子邮件]=S.[办公室电子邮件]
,T.[Listing Tracking ID]=S.[Listing Tracking ID]
,T.[FA唯一列表标识符-参考ID]=S.[FA唯一列表标识符-参考ID]
,T.[Update Timestamp]=S.[Update Timestamp]
,T.[Agent_SK]=HASHBYTES('MD5',S.[上市代理许可证号码]+'~'+S.[上市代理名称]
+'~'+S.[挂牌代理地址]+'~'+S.[挂牌代理电话]
+'~'+S.[上市代理电子邮件])
,T.[添加、更改、删除指标]=S.[添加、更改、删除指标]
,T.LoadDate=GETDATE()
不匹配时,S[添加、更改、删除指标]'D'
然后插入
([物业地址]
,[地产城]
,[财产状况]
,[Property Zip]
,[Property Zip+4]
,[StreetNum]
,[指示]
,[街道名称]
,[街道类型]
,[Post_方向]
,[单位]
,[街道名称邮政]
,[评估员的包裹识别号]
,[县FIPS]
,[内部FA属性参考ID]
,[物业类型]
,[物业子类型]
,[FA计算的市场天数]
,[当前原始上市日期]
,[上市编号]
,[现状]
,[状态子类型]
,[租金指标]
,[当前上市价格]
,[售价]
,[出售日期]
,[FA调整售价]
,[FA售价范围]
,[上市代理许可证号码]
,[上市代理名称]
,[上市代理地址]
,[挂牌代理电话]
,[上市代理电子邮件]
,[办公室名称]
,[办公地址]
,[办公室电话]
,[办公室电邮]
,[列表跟踪ID]
,[FA唯一列表标识符-参考ID]
,[更新时间戳]
,[Agent_SK]
,[添加、更改、删除指标]
,装货日期)
价值观
(S)[物业地址]
,S.[地产城]
,S.[财产状况]
,S.[属性Zip]
,S.[属性Zip+4]
,S.[StreetNum]
,S.[方向]
,S.[街道名称]
,S.[街道类型]
,S.[后方向]
,S.[单位]
,S.[街道名称邮政]
,S.[评估员的包裹识别号]
,S.【县FIPS】
,S.[内部FA属性参考ID]
,S.[属性类型]
,S.[属性子类型]
,S.【市场上的FA计算天数】
,S.[当前原始上市日期]
,S.[上市编号]
,S.[现状]
,S.[状态子类型]
,S.[租金指标]
,S.[当前上市价格]
,S.[售价]
,S.[出售日期]
,S.【FA调整后的售价】
,S.【FA售价范围】
,S.[上市代理许可证号码]
,S.[上市代理名称]
,S.[上市代理地址]
,S.[上市代理电话]
,S.[上市代理电子邮件]
,S.[办公室名称]
,S.[办公地址]
,S.[办公室电话]
,S.[办公室电子邮件]
,S.[正在列出跟踪ID]
,S.[FA唯一列表标识符-参考ID]
,S.[更新时间戳]
,HASHBYTES('MD5',S.[上市代理许可证号码]+'~'+S.[上市代理名称]
+'~'+S.[挂牌代理地址]+'~'+S.[挂牌代理电话]
+'~'+S.[上市代理电子邮件])
,S.[添加、更改、删除指标]
,GETDATE())
当与S匹配时[添加、更改、删除指示器]=“D”
然后删除;
在这种情况下,如果
[FA Unique Listing Identifier-Ref ID]
匹配并且
[Add,Change,Delete Indicator]
是除“D”以外的任何值,则应该更新,但是,它似乎正在尝试插入

故障发生在重复密钥上。如果我得到重复密钥失败,不应该在密钥上拾取合并并尝试首先进行更新吗

谢谢。

假设“唯一”列在中不是唯一的
MERGE PROPERTY.DBO.MLS AS T
    USING (SELECT s.*,
                  ROW_NUMBER() OVER (PARTITION BY [FA Unique Listing Identifier - Ref ID]
                                     ORDER BY ?? DESC
                                    ) as seqnum
           FROM STAGE.DBO.STAGE_MLS AS S
          ) s
    ON T.[FA Unique Listing Identifier - Ref ID] = S.[FA Unique Listing Identifier - Ref ID] AND seqnum = 1
. . .