首页 > 解决方案 > SQL - 将工作分配给工人 - 替代循环?

问题描述

在 SQL Server 2019 中,我有一个未分配任务表,以及另一个可用于处理这些任务的工作人员表。我的要求是通过使用将执行任务的工作人员更新表中的WorkerID列来平均分配工作人员在可用任务上。TasksID

给定具有以下结构的表,我想知道如何在不使用循环的情况下进行这些分配。我怀疑这可以通过使用行号、排名或其他一些类似的 SQL Server 魔法来完成,但我无法弄清楚。谢谢!

任务表:

JobID    JobName           WorkerID
------------------------------------
23       Carry Groceries   NULL
1234     Drive             NULL
6543     Dig               NULL
234567   Walk              NULL
78       Clean Room        NULL
54       Cook Dinner       NULL
2        Move Logs         NULL
34       Cut Grass         NULL
99       Milk Chickens     NULL

工人表:

WorkerID   WorkerName
---------------------
67         Larry
42         Sue
10         Peter
45         Steve

表的预期结果Tasks

JobID    JobName           WorkerID
--------------------------------------
23       Carry Groceries   67
1234     Drive             42
6543     Dig               10
234567   Walk              45
78       Clean Room        67
54       Cook Dinner       42
2        Move Logs         10
34       Cut Grass         45
99       Milk Chickens     67

标签: sqlsql-serversql-server-2019

解决方案


您可以使用窗口函数分配一个编号,然后join。“循环”方法是:

with toupdate as (
      select t.*, row_number() over (order by (select null)) as seqnum
      from tasks t
     )
update toupdate
     from toupdate join
          (select w.*,
                  row_number() over (order by (select null)) as seqnum,
                  count(*) over () as cnt
           from workers w
          ) w
          on w.seqnum = ( (toupdate.seqnum - 1) % w.cnt) + 1;

推荐阅读