繁体   English   中英

更新多个员工记录

[英]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语句中解决此问题,但是您的代码中确实存在一些问题:

  1. 当您在T5 WHERE子句中选择MIN时,您假设每个员工最多有2条记录。 这将忽略3中的第二条记录或4中的第三条记录,以此类推。这些记录也需要结束日期,因此这将是一个问题
  2. 同样,当您在T1查询的条件中选择SELECT MAX时,您假设每位员工仅2条记录,并且如果有任何记录,则会错过中间记录
  3. 这不是错误,只是样式点:您可以用where子句中的条目代替“ SELECT COUNT(*)”子查询:“ T1.employee_id IN(从employee_tbl组中按employee_id选择SELECT employee_id, COUNT(1)> 1)“

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM