【问题标题】:Duplicates not getting ignored in SQL ServerSQL Server 中不会忽略重复项
【发布时间】:2019-12-19 08:17:15
【问题描述】:

我有一个有两行的临时表。 他们的 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-server ssms-2016


【解决方案1】:

您应该使用MERGE 语句,该语句的作用是atomically,因此您不需要自己进行锁定(此外,临时表上的隔离查询提示没有任何作用)。

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# 上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多