全部,在其中一个查询中需要帮助。
我们有员工记录。
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'
对于个人用户来说,它的工作正常,但当我注释掉特定用户时,为了进行批量更新,它的显示错误。类别标量全选,SELECT INTO语句或VALUES INTO语句的结果是多行。
答案 0 :(得分:0)
编辑:
这确实需要一种迭代方法 - 使用脚本来遍历END_DT ='9999-12-31'的每条记录,对于每一条记录,找到 next START_DT要简单得多。尝试在单个UPDATE语句中一次完成所有操作既有趣又诱人,但不太实用。
此外,这看起来像你要清理你的桌子,而不是应该多次运行的东西。这不是最好的时间用于为一次性问题提出一个聪明,优雅的解决方案。
应该发生的事情是,每次添加新记录时,前一条记录都应该获得新的开始日期。这比试图追溯所有这一切要简单得多。或者,您可以完全忘记END_DT,因为维护它是很麻烦的,如果您需要查找它,可以使用查询动态计算它。
话虽如此,虽然我没有一个优雅的解决方案来在单个sql语句中解决这个问题,但你的代码中确实存在一些问题: