首页 > 解决方案 > SQL Server 中不会忽略重复项

问题描述

我有一个有两行的临时表。他们的 ID 是 999359143、999365081

我有一个没有主键但有一个基于 id 和日期的唯一索引的表。

这个 999359143 已经存在于表中。因此,当我使用我的查询时,它仍然试图将临时表中的行插入到普通表中,但它会出错。这是下面的查询

INSERT INTO [XferTable]
           ([DataDate]
           ,[LoanNum]
          )

SELECT Distinct t1.[DataDate]
           ,t1.[LoanNum]               
FROM #AllXfers t1 WITH(HOLDLOCK) 
WHERE NOT EXISTS(SELECT t2.LoanNum, t2.DataDate
                    FROM XferTable t2 WITH(HOLDLOCK) 
                   WHERE t2.LoanNum = t1.LoanNum AND t2.DataDate = t1.DataDate
)

有一个更好的方法吗?

标签: sql-serverssms-2016

解决方案


您应该使用该MERGE语句,它以原子方式运行,因此您不需要自己进行锁定(此外,临时表上的隔离查询提示不会实现任何效果)。

MERGE XferTable AS SOURCE
USING #AllXfers AS TARGET
ON
    SOURCE.[DataDate] = TARGET.[DataDate]
    AND SOURCE.[LoanNum] = TARGET.[LoanNum]
WHEN NOT MATCHED BY TARGET--record in SOURCE but not in TARGET
THEN INSERT
(
     [DataDate]
    ,[LoanNum]
)
VALUES
(
     SOURCE.[DataDate]
    ,TARGET.[LoanNum]
);

您的主键违规可能是因为您使用 (Date, Loan#) 作为唯一性标准,而您的主键可能仅在 Loan# 上。


推荐阅读