MySQL8.0用INNER JOIN关联MAX(DateUpdated)最新记录更新Child表状态
MySQL 8.0 关联最新Enrolment记录更新Child表方案
你原有的SQL出现异常的原因是关联时匹配到了同一个EnrolmentId对应的多条Enrolment记录,会导致更新时状态不确定。可以通过窗口函数ROW_NUMBER()先提取每个EnrolmentId对应的最新记录,再关联更新,实现代码如下:
UPDATE child c INNER JOIN ( SELECT EnrolmentId, EnrolmentStatus, ROW_NUMBER() OVER (PARTITION BY EnrolmentId ORDER BY DateUpdated DESC) AS rn FROM enrolment ) e ON c.EnrolmentId = e.EnrolmentId AND e.rn = 1 SET c.EnrolmentStatus = e.EnrolmentStatus;
逻辑说明
PARTITION BY EnrolmentId:将Enrolment表的记录按EnrolmentId分组,同一ID的记录分到同一组ORDER BY DateUpdated DESC:每组内按更新时间倒序排序,最新的记录排在最前,对应rn值为1- 关联时仅匹配
e.rn = 1的记录,保证每个Child记录只会关联到一条最新的Enrolment状态,避免重复关联的问题
如果存在同一个EnrolmentId有两条完全相同DateUpdated的最新记录,可以在排序规则后追加额外字段(比如表主键ID)保证排序唯一:
ROW_NUMBER() OVER (PARTITION BY EnrolmentId ORDER BY DateUpdated DESC, 主键字段名 DESC) AS rn
内容的提问来源于stack exchange,提问作者snowflakes74
相关产品推荐
相关产品推荐

