RMD*_*RMD 5 t-sql insert duplicate-removal sql-server-2008
数据库是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
Run Code Online (Sandbox Code Playgroud)
但是,这似乎不能防止在某些情况下重复插入.
似乎(如果你仔细考虑并查看查询计划,这是有道理的)在左连接操作中只使用@MyTableVariable的初始"状态".换句话说,如果在运行此语句之前@MyTableVariable已经有SomeID,这将防止重复,但如果SomeTable/SomeOtherTalbe上的FROM/INNER JOIN导致重复的SomeID,则不会阻止重复.
除了简单地在SELECT语句上打一个DISTINCT之外,还有另一种更有效的方法来处理它吗?
据我所知,SQL Server 中没有INSERT IGNORE办法INSERT ON DUPLICATE KEY。当然,有 MERGE,但它不会解决您的问题,因为它的行为与您的 INSERT 相同,即它会引发异常。
还有另一种更有效的方法来处理这个问题吗?
在我看来,你的选择是:
尝试找到更具体的过滤/连接方式,以免产生重复。
在早期阶段的某处“Slap”DISTINCT,以防止重复项进入首先连接的任何一个表。
将主要负责生成重复项的表转换为在本地应用 DISTINCT 的子选择。
如果您无法生成无重复的结果集,则必须为消除可能的重复付出代价(在性能方面)。无论它是什么,DISTINCT,或 GROUP BY,或者可能是排名函数,它都会导致一些性能损失,你应该接受这个事实。