【发布时间】:2013-02-01 09:27:12
【问题描述】:
数据库是 SQL Server 2008。我有一个查询,它从一个或多个表中提取行,然后尝试将它们插入到表变量中。
我想要一种防止重复插入的有效方法,所以我想出的是:
INSERT INTO @MyTableVariable
SELECT SomeID
FROM SomeTable st
INNER JOIN SomeOtherTable sot ON sot.SomeID = st.SomeID
LEFT JOIN @MyTableVariable t ON t.SomeID = sot.SomeID
WHERE t.SomeID IS NULL
然而,这似乎并不能防止在某些情况下重复插入。
似乎(如果您考虑一下并查看查询计划,这是有道理的)在左连接操作中只使用了@MyTableVariable 的初始“状态”。换句话说,如果在运行此语句之前@MyTableVariable 中已经包含 SomeID,这将防止重复,但如果 SomeTable/SomeOtherTalbe 上的 FROM/INNER JOIN 导致 SomeID 重复,则不会防止重复。
除了简单地在 SELECT 语句上添加一个 DISTINCT 之外,还有其他更有效的方法来处理这个问题吗?
【问题讨论】:
-
如果您不想使用
DISTINCT或GROUP BY,那么您可以在列上创建唯一索引,并忽略重复键。 -
您如何处理重复的键错误?这实际上比执行 distinct 更快吗?
标签: sql-server-2008 tsql insert duplicate-removal