【发布时间】:2021-02-03 19:24:06
【问题描述】:
下面的存储过程不应该尝试插入任何记录,如果它们存在于我的临时表“r”或我试图将它们插入“记录”的实际表中。
我收到主键约束错误,因为 NOT IN 函数仍在尝试插入已经在记录表中的记录。
有人可以看看我下面的代码并告诉我这是否是正确的方法吗?
INSERT INTO [RxEvidence].[Record] ([RecordID], [Source], [Notes], [ReceivedFrom], [ReceivedDate], [CompleteDate])
SELECT r.[RecordID], r.[Source], r.[Notes], r.[ReceivedFrom], r.[ReceivedDate], r.[CompleteDate]
FROM @Records r WHERE r.RecordID NOT IN (SELECT RecordId FROM RxEvidence.Record)
GROUP BY r.[RecordID], r.[Source], r.[Notes], r.[ReceivedFrom], r.[ReceivedDate], r.[CompleteDate];
【问题讨论】:
-
样本数据和期望的结果真的很有帮助。
-
这是
EXCEPT可能无需分组就能为您做的事情(假设行可以或应该在所有列上匹配,而不仅仅是 ID)。 -
抱歉,这是生产数据,我不确定要包含哪些样本。 @Records 包含 RxEvidence.Record 表中已经存在的 RecordID,因此它不应该尝试将它添加到给定“NOT IN”的表中,但它仍然会,这会导致主键约束错误。我想我只是希望有人能根据该信息发现这是否写错了。
-
为什么最后有 GROUP BY?
-
这句话一点都不复杂,所以我必须相信主键异常是正确的。所以我猜主键是一个复合键,因为 RecordID 来自外部源。只是猜测,但如果主键是 {RecordId, Source}
标签: sql tsql select ssms sql-insert