具有相同表子查询的 MySQL 更新

标签 mysql sql

我有一个包含一系列日期范围的表(EMP_ID、START_DATE、END_DATE)。我想要做的是确保它们都是连续的,因此对于任何给定的 EMP_ID,END_DATE 应该比下一个 START_DATE 小一个。
我有以下查询,可让我识别不连续的记录:

  SELECT H.EMP_ID, 
         H.START_DATE, 
         H.END_DATE,
         DATE(
                 (   SELECT MIN(START_DATE) 
                       FROM TSRHierarchy I
                      WHERE I.START_DATE > H.START_DATE 
                        AND I.EMP_ID = H.EMP_ID
                  )
             ) AS NEXT_DATE 
    FROM TSRHierarchy H
  HAVING END_DATE <> DATE_ADD(NEXT_DATE, INTERVAL -1 DAY)
ORDER BY H.EMP_ID, H.START_DATE;

我不能做的是弄清楚如何将其转换为 UPDATE 语句? MySQL 文档指出“目前,您不能更新表并从子查询中的同一个表中进行选择。”这可能是我的问题的一部分。
有任何解决方法的建议吗?

最佳答案

试试这个 UPDATE query using JOIN

UPDATE TSRHierarchy t
         JOIN
           ( SELECT H.EMP_ID, 
                    H.START_DATE, 
                    H.END_DATE,
                    DATE((SELECT MIN(START_DATE) 
                                 FROM TSRHierarchy I
                                      WHERE I.START_DATE > H.START_DATE 
                                      AND I.EMP_ID = H.EMP_ID
                        )) AS NEXT_DATE 
             FROM TSRHierarchy H
             HAVING END_DATE <> DATE_ADD(NEXT_DATE, INTERVAL -1 DAY)
           ) AS t2
         ON t.EMP_ID = t2.EMP_ID
SET t.END_DATE = t2.NEXT_DATE 

关于具有相同表子查询的 MySQL 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21751869/

相关文章:

mysql - 我已在数据库中插入数据,但不知道如何在 laravel 中显示

php - 如何读取 PHP 数组中的多个日期值,然后将它们相减,返回 int 值

mysql - 我正在使用 MYSQL 计算学生表中每个科目的 TOP-N。

java - hibernate 组合键映射外键问题

SQL INSERT(选择)使用基于另一列值的 CASE

sql - Hive SQL - 如何从每个人中删除最大(日期)?

mysql - sql select 查询不返回某些列

php - DATEDIFF 和 NOW() mysql_fetch_array 错误

sql - 如何更改带有索引的表的列?

sql - 在两个不同服务器之间安全通信的最佳方法