更新来自其他表的表值,如分布
Posted
技术标签:
【中文标题】更新来自其他表的表值,如分布【英文标题】:UPDATE Table value from other table like distribution 【发布时间】:2019-10-13 14:41:11 【问题描述】:我有一个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 |
【问题讨论】:
您为什么使用不受支持的 SQL Server 版本。 这是我这里唯一可用的许可来源 【参考方案1】:在受支持的 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;
【讨论】:
无法绑定多部分标识符“t1.seqnum” 升级版请告诉我解决方法?以上是关于更新来自其他表的表值,如分布的主要内容,如果未能解决你的问题,请参考以下文章