更新块中的行号

时间:2018-11-14 10:51:22

标签: sql sql-server tsql sql-server-2012

我需要对行进行批处理,以便批处理作业将提取适当的记录以进行处理。目前,我为此编写了几个更新查询:

update salestable
set BATCHNO=1
where status=1 and id in (
select top 1000 id from salestable where status=1)

update salestable
set BATCHNO=2
where status=1 and id in (
select top 1000 id from salestable where status=1
and batchno not in (1))


update salestable
set BATCHNO=3
where status=1 and id in (
select top 1000 id from salestable where status=1
and batchno not in (1,2))
...
...
... on and on

对此是否有一个查询?

1 个答案:

答案 0 :(得分:2)

类似的事情可能会起作用:

WITH cte AS (
    SELECT id, BATCHNO, ROW_NUMBER() OVER (ORDER BY id) rn
    FROM yourTable
    WHERE status = 1
)

UPDATE cte
    SET BATCHNO = ((rn - 1) / 1000) + 1;

请注意,我已经假设使用id列对批次进行排序。在当前的子查询中,您正在使用TOP而不使用ORDER BY,这是相当不确定的事情。关于某些排序,我们只能说前1000条记录。


由MYGz编辑: 尽管我使用了除法,但是由于不完全除法,我遇到了一个额外的批处理无法容纳的问题。

因此,如前所述和建议的模数是更好的选择,因为它不会提供额外的批处理编号。