gpt4 book ai didi

sql-server-2008 - 防止重复表插入

转载 作者:行者123 更新时间:2023-12-04 07:12:44 25 4
gpt4 key购买 nike

数据库是 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 之外,还有另一种更有效的方法来处理这个问题吗?

最佳答案

据我所知,没有办法INSERT IGNOREINSERT ON DUPLICATE KEY在 SQL Server 中。当然有 MERGE,但它不会解决您的问题,因为它的行为与您的 INSERT 相同,即它会引发异常。

is there another more efficent way to handle this?



在我看来,您的选择是:
  • 尝试找到更具体的过滤/加入方式,以免产生重复。
  • 'Slap' DISTINCT 在较早阶段的某个地方,以防止重复项进入首先连接的任何一个表。
  • 将主要负责生成重复项的表转换为在本地应用 DISTINCT 的子选择。

  • 如果您无法生成无重复的结果集,您将不得不为消除可能的重复付费(性能方面)。无论是 DISTINCT 还是 GROUP BY,或者可能是排名函数,它都会导致一些性能损失,你应该接受这个事实。

    关于sql-server-2008 - 防止重复表插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6390700/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com