更新多个员工记录

时间:2014-07-30 14:02:31

标签: sql sql-server

全部,在其中一个查询中需要帮助。

我们有员工记录。

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语句的结果是多行。

1 个答案:

答案 0 :(得分:0)

编辑:

这确实需要一种迭代方法 - 使用脚本来遍历END_DT ='9999-12-31'的每条记录,对于每一条记录,找到 next START_DT要简单得多。尝试在单个UPDATE语句中一次完成所有操作既有趣又诱人,但不太实用。

此外,这看起来像你要清理你的桌子,而不是应该多次运行的东西。这不是最好的时间用于为一次性问题提出一个聪明,优雅的解决方案。

应该发生的事情是,每次添加新记录时,前一条记录都应该获得新的开始日期。这比试图追溯所有这一切要简单得多。或者,您可以完全忘记END_DT,因为维护它是很麻烦的,如果您需要查找它,可以使用查询动态计算它。

话虽如此,虽然我没有一个优雅的解决方案来在单个sql语句中解决这个问题,但你的代码中确实存在一些问题:

  1. 当你在T5 WHERE子句中选择SELECT时,你假设每个员工最多有2条记录。这将忽略3中的第2条记录或4条中的第3条记录等。这些记录也需要结束日期,因此这将是一个问题
  2. 同样,当您在T1查询的条件中选择SELECT MAX时,您假设每个员工只有2条记录而您错过了中间记录(如果有的话)
  3. 这不是错误,只是一个样式点:而不是“SELECT COUNT(*)”子查询,您可以将其替换为where子句中的条目:“T1.employee_id IN(从employee_tbl组中选择employee_id) by employee_id有COUNT(1)> 1)“