首页 > 解决方案 > 更新来自其他表的表值,如分布

问题描述

我有一个table 1我必须从其他桌子上分发奖励的地方,table 2但以先发球的方式从其他桌子行开始。

Table 1
ATTIME    | Absent | LeaveType
-----------------------------
2019-01-01| 1      | 
2019-01-02| 1      | 
2019-01-03| 1      | 
2019-01-04| 1      | 
2019-01-05| 1      | 
2019-01-06| 1      | 

Table 2
LeaveType | Total  
-------------------
Casual    | 3   
Sick      | 2

我已经通过使用游标实现了它,但是想要一个设置基本UPDATE QUERY或任何其他优化我的执行计划的选项,

最终结果将是......

Table 1

ATTIME    | Absent | LeaveType
-----------------------------
2019-01-01| 1      | CL
2019-01-02| 1      | CL
2019-01-03| 1      | CL
2019-01-04| 1      | SL
2019-01-05| 1      | SL
2019-01-06| 1      |

标签: sqlsql-serversql-server-2008-r2

解决方案


在受支持的 SQL Server 版本中,您将使用累积和row_number()

with toupdate as (
      select t1.*,
             row_number() over (order by attime) as seqnum
      from table1 t1
     )
update toupdate
    set leavetype = t2.leavetype
    from (select t2.*,
                 sum(total) over (order by leavetype) as runningtotal
          from table2 t2
         ) t2
    where toupdate.seqnum between t2.runningtotal + 1 - total and t2.runningtotal;

在旧的、不受支持的 SQL Server 版本中,累积总和更加麻烦。一种方法使用相关子查询:

with toupdate as (
      select t1.*,
             row_number() over (order by attime) as seqnum
      from table1 t1
     )
update toupdate
    set leavetype = t2.leavetype
    from (select t2.*,
                 (select sum(total)
                  from table2 tt2
                  where tt2.leavetype <= t2.leavetype
                ) as runningtotal
          from table2 t2
         ) t2
    where t1.seqnum between t2.runningtotal + 1 - total and t2.runningtotal;

推荐阅读