【发布时间】:2020-09-21 06:10:42
【问题描述】:
我尝试使用下面的 SQL 将值从一个表 importTable 插入到另一个表 POInvoicing。看来,下面这个查询的工作方式是检查POInvoicing 表中是否存在来自importTable 的任何可能重复项,对于那些不重复的条目,它将它们插入表中。最终结果是 SQL 插入 importTable 中已存在的重复项。有没有办法告诉 SQL Server 检查表中是否存在可能的重复条目,如果没有,请添加下一行。然后检查表中是否有重复条目,如果没有,请添加下一行。我知道这会慢一些,但速度不是问题。
INSERT INTO POInvoicing
(VendorID, InvoiceNo)
SELECT dbo.importTable.VendorID,
dbo.importTable.InvoiceNo
FROM dbo.importTable
WHERE NOT EXISTS (SELECT VendorID,
InvoiceNo
FROM POInvoicing
WHERE POInvoicing.VendorID = dbo.importTable.VendorID AND
POInvoicing.InvoiceNo = dbo.importTable.InvoiceNo)
这并不是我所希望的功能。我想要的是查询在表中插入一行,然后在插入下一行之前检查“重复”。 importTable 中的重复项是 VendorID 和 InvoiceNo 的组合。 importTable 中有大约十几个不同的列,从技术上讲,每一行都是不同的,所以 DISTINCT 在这里不起作用。
由于与上述问题无关的几个原因,我不能简单地从 importTable 中删除重复项(尽管我可以在必要时提供),因此该方法已失效。
【问题讨论】:
-
仅供参考,不推荐使用列中的 3 部分命名,并且可以在 SQL Server 的未来版本中删除。建议您为表设置别名,然后使用表的别名限定列。
-
因此,如果您在
importTable中有两行(例如VendorID = 5, InvoiceNo = 10)并且它们对于InvoiceDate有两个不同的值(或相同的值),您如何确定哪一个不是副本? -
@AaronBertrand 使
importTable中的每一行不同的是POInvoicing表不关心并且不会添加到POInvoicing表中的杂项数据。另一方面,我们的POInvoicingDetails表确实关心那些额外的数据并将利用它。为了简单起见,我想我可以进一步减少查询。实际上,不会有两个 VendorID = 5、InvoiceNo = 10 的条目具有两个不同的 EntryDate。 -
您可以使用 MERGE 语句并且只处理带有 WHEN NOT MATCHED BY TARGET 部分的 INSERT?
-
@JonathanLarouche 我不认为
MERGE是这里需要的(它仍然会为NOT MATCHED返回多行)和I wouldn't recommend it generally even if it were。
标签: sql-server insert duplicates