基于关联表数据更新列值的SQL语法实现
解决方案:更新无未结束行程段的铁路车次到达状态
需求明确:把所有关联的TripSegments里没有EndDate为NULL记录的RailcarTrips,其Arrived字段设为true(SQL Server中bit类型的true对应值为1)。
以下是几种可行的SQL写法,按需选择:
方法一:NOT EXISTS子查询(最直观)
UPDATE RailcarTrips SET Arrived = 1 WHERE NOT EXISTS ( SELECT 1 FROM TripSegments WHERE TripSegments.RailcarTripId = RailcarTrips.Id AND TripSegments.EndDate IS NULL );
逻辑:检查当前车次是否存在任何未结束的行程段(EndDate为NULL),如果不存在,就更新Arrived状态。
方法二:LEFT JOIN + IS NULL
UPDATE rt SET rt.Arrived = 1 FROM RailcarTrips rt LEFT JOIN TripSegments ts ON rt.Id = ts.RailcarTripId AND ts.EndDate IS NULL WHERE ts.Id IS NULL;
逻辑:通过左关联找出所有有未结束行程段的车次,剩下的(关联结果中ts.Id为NULL)就是符合条件的车次,直接更新。
方法三:GROUP BY + HAVING统计
UPDATE rt SET rt.Arrived = 1 FROM RailcarTrips rt INNER JOIN ( SELECT RailcarTripId FROM TripSegments GROUP BY RailcarTripId HAVING COUNT(CASE WHEN EndDate IS NULL THEN 1 END) = 0 ) ts_group ON rt.Id = ts_group.RailcarTripId;
逻辑:先按车次分组统计未结束行程段的数量,数量为0的车次就是目标,关联后更新状态。
重要提醒
执行UPDATE前一定要先验证符合条件的记录,避免误操作,比如用下面的SELECT语句先确认:
-- 验证NOT EXISTS方法的目标记录 SELECT * FROM RailcarTrips WHERE NOT EXISTS ( SELECT 1 FROM TripSegments WHERE TripSegments.RailcarTripId = RailcarTrips.Id AND TripSegments.EndDate IS NULL );
内容的提问来源于stack exchange,提问作者Jonathan Wood
相关产品推荐
相关产品推荐

