在WHERE子句中使用"IN",其中集合中的项目数非常大

Kar*_*rim 14 sql sql-server ms-access

我有一种情况,我需要对一组非常大的行进行更新,我只能通过它们的ID来识别(因为目标记录是由用户选择的,除了它是用户的记录集之外没有任何共同之处想修改).所有这些记录都在更新相同的属性,所以我想进行一次UPDATE调用.

在UPDATE语句中使用"WHERE IN(1,2,3,4,..... 10000)"是不是更糟糕的做法还是有更好的方法来进行此更新?

为每条记录使用单独的更新语句并将它们粘贴到单个事务中会更有意义吗?现在我正在使用SQL Server和Access,但如果可能的话,我希望在任何类型的关系数据库中听到更广泛的最佳实践解决方案.

Otá*_*cio 15

另一种方法是将这些数字存储在临时表中,并在连接中使用它来进行更新.如果能够执行单个更新语句肯定比每个记录执行一个语句更好.


Dan*_*man 9

我总是会用

WHERE id IN (1,2,3,4,.....10000)
Run Code Online (Sandbox Code Playgroud)

除非你的in子句是愚蠢的大,这不应该从用户输入真正发生.

编辑:例如,Rails在幕后做了很多

在单个事务中执行单独的更新语句肯定不会更好.


Jos*_*ons 5

您如何生成IN子句?

如果还有另一个SELECT语句生成这些值,则可以将其插入UPDATE中,如下所示:

UPDATE TARGET_TABLE T
SET
  SOME_VALUE = 'Whatever'
WHERE T.ID_NUMBER IN(
                    SELECT ID_NUMBER  --this SELECT generates your ID #s.
                    FROM SOURCE_TABLE
                    WHERE SOME_CONDITIONS
                    )
Run Code Online (Sandbox Code Playgroud)

在某些RDBMses中,通过使用EXISTS语法,您将获得更好的性能,如下所示:

UPDATE TARGET_TABLE T
SET
  SOME_VALUE = 'Whatever'
WHERE EXISTS (
             SELECT ID_NUMBER  --this SELECT generates your ID #s.
             FROM SOURCE_TABLE S
             WHERE SOME_CONDITIONS
               AND S.ID_NUMBER =  T.ID_NUMBER
             )
Run Code Online (Sandbox Code Playgroud)