【发布时间】:2016-04-02 19:49:31
【问题描述】:
我正在寻找一些关于在 t-sql DML 的特定场景中哪种类型的更新最好的建议。
遇到数据问题,其中结束日期比当前记录的开始日期早一天,并且需要将结束日期设置为多个实体的下一行的开始日期
例如
rowid entity id record_type start_date end_date
214 250 1 H 2015-01-01 2014-12-31
329 250 1 H 2015-04-25 2015-04-24
533 250 1 C 2015-11-01 NULL
11 250 2 H 2015-06-01 2014-05-29
292 250 2 H 2015-09-11 2015-09-10
987 250 2 C 2015-10-01 NULL
我需要做的是将第一条记录 end_date 更新为下一条记录 startdate - 每个员工/实体上的 1。
目前,有超过 5000 个实体受此影响,因此我试图以某种方式在每条记录上更新此内容以节省时间。
我能做的但要花很多时间的是 1. 将所有公司的历史记录的最大行数合并为一个数字 2.为总行数创建相同数量的临时表 3. 将最小开始日期值插入第一个临时表 4.将不在临时表1中的最小值插入到表2中,依此类推 5.然后将临时表1的结束日期更新为临时表2的开始日期-1天 6. 从那里,在实际表上运行更新,每个临时表有多个更新语句,加入 rowid。
最终输出如下:
rowid entity id record_type start_date end_date
214 250 1 H 2015-01-01 2014-04-24
329 250 1 H 2015-04-25 2015-10-31
533 250 1 C 2015-11-01 NULL
11 250 2 H 2015-06-01 2014-09-10
292 250 2 H 2015-09-11 2015-9-31
987 250 2 C 2015-10-01 NULL
除了我的一长串临时表/更新之外的任何建议都将不胜感激!我在想一些可能是光标的东西,但我不太确定这是否是为这种情况编写更新的更快方法。
【问题讨论】:
-
使用SELF JOIN 和
LAG()函数。 -
提示:使用适当的软件(MySQL、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如
sql-server-2014。语法和功能的差异通常会影响答案。
标签: sql sql-server tsql dml