我需要对行进行批处理,以便批处理作业将提取适当的记录以进行处理。目前,我为此编写了几个更新查询:
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
对此是否有一个查询?
答案 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编辑: 尽管我使用了除法,但是由于不完全除法,我遇到了一个额外的批处理无法容纳的问题。
因此,如前所述和建议的模数是更好的选择,因为它不会提供额外的批处理编号。