更新来自其他表的表值,如分布

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” 升级版请告诉我解决方法?

以上是关于更新来自其他表的表值,如分布的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 更新基于 2 个其他表的连接

更新具有来自同一表的最新相关 id 的表列

如何处理具有排除约束的表的更新?

从具有多个条目的另一个表更新MYSQL

如何用另一个表的列值更新一个表的列值? [复制]

使用来自其他平面表的数据的 SQL 更新行