sql-server - 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
)
有一个更好的方法吗?
解决方案
您应该使用该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# 上。
推荐阅读
- kotlin - 当我在 Kotlin 的函数中使用 _id 时,它指向哪一个?
- reactjs - 如何在 reactjs 组件中初始化 Fancybox?
- cgi - openwrt C cgi脚本
- java - 如何从文件阅读器中删除某些值(使用 ArrayList)?
- r - r 和 ggplot 不为美国或英国着色
- asp.net - .Net C# 4.5.1 中的 WebApp 不适用于 TLS 1.2
- c# - DocumentFormat.OpenXml 2.8 版在使用 MergeField 时不起作用
- serilog - 尝试使用命名空间的第一部分过滤第二个 RollingFile
- php - Zabbix REST-API 输出限制为 10 万条记录
- c++11 - 如何在 ASCII 游戏期间阻止蓝线出现在 Windows 控制台上?