[英]Updating multiple employee records
全部,在其中一个查询中需要帮助。
我们有员工记录。
Employeeid,dept,startdate.enddate.
Sam,IT,2013-10-12, 9999-12-31
现在,当员工更换部门时,我们有了新记录。 所以,
Employeeid,dept,startdate.enddate.
Sam,IT,2013-10-12, 2014-01-03
Sam,Finance,2014-01-04, 9999-12-31
因此,它将在新记录到来时将结束日期更新为-1日期。
有的员工只有一行(没有更改部门),有的员工只有两三列。 尝试查询但不起作用。 任何帮助。
UPDATE employee_tbl T5
SET T5.END_DT = (
SELECT T1.START_DT - 1 DAY
FROM employee_tbl T1,
(
SELECT COUNT(*), employee_id
FROM employee_tbl
GROUP BY employee_id
HAVING COUNT(*) > 1 ) TMP
WHERE (TMP.employee_id = T1.employee_id)
AND T1.START_DT = (SELECT MAX (T3.START_DT) FROM employee_tbl T3
WHERE T1.employee_ID = T3.employee_ID)
AND T1.employee_id = 'sam334'
ORDER BY T1.employee_id, T1.START_DT DESC)
WHERE T5.employee_ID = 'sam334'
AND T5.START_DT =
(SELECT MIN (T4.START_DT) FROM employee_tbl T4
WHERE T4.employee_id_ID = T5.employee_ID AND T4.END_DT = '9999-12-31')
AND T5.END_DT = '9999-12-31'
对于单个用户,它的工作正常,但是当我注释掉特定用户时,对于大规模更新,它显示为error.Category标量fullselect,SELECT INTO语句或VALUES INTO语句的结果超过一行。
编辑:
这确实需要一种迭代方法-使用脚本来爬网END_DT ='9999-12-31'的每条记录,对于每条记录,查找下一个 START_DT更简单。 尝试在单个UPDATE语句中一次完成所有操作很吸引人,但是很不实用。
另外,这看起来像是您要清理表所要做的事情,而不是应该多次运行的事情。 为一次性问题提出聪明,优雅的解决方案并不是最好的时间利用。
应该发生的是,每次添加新记录时,先前的记录都应获得一个新的开始日期。 这也比尝试追溯全部操作要简单得多。 另外,您可能会完全忘记END_DT,因为要维护它很麻烦,如果需要查找,可以使用查询来动态计算它。
话虽这么说,虽然我没有一个优雅的解决方案可以在单个sql语句中解决此问题,但是您的代码中确实存在一些问题:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.