UPDATE EXISTS语句未按预期生效,请求排查SQL问题
问题:SQL更新语句未生效,无法匹配status表更新a1表code字段
我需要实现的需求是:检查a1表的所有行是否存在于status表中(匹配aid和side,且status表中对应记录completed=1),若存在则将a1表的code字段更新为365,否则保留原数据。但执行以下SQL后提示“0 rows updated”,未达到预期效果。
原SQL语句:
UPDATE a1 SET code = 365 WHERE EXISTS ( SELECT 1 FROM status WHERE status.aid = a1.aid AND status.side = a1.side AND status.year = EXTRACT(YEAR FROM sysdate) AND status.month = EXTRACT(MONTH FROM(add_months(trunc(sysdate,'mm'),-1))) AND status.completed = 1 );
表数据与预期输出
a1表数据
Id aid side code 1 2 3 0 2 2 4 1 3 2 5 4
status表数据
Id aid side year month completed 1 2 3 2023 3 1 2 2 4 2023 3 1 3 2 23 2022 2 1
预期输出
Id aid side code 1 2 3 365 2 2 4 365 3 2 5 4
问题原因
原SQL中的日期条件限制了仅匹配当前系统年份和上个月的status记录。以给定的status表数据为例,匹配的记录年份是2023、月份是3,只有当当前系统日期处于2023年4月时,add_months(trunc(sysdate,'mm'),-1)才会返回2023年3月,此时日期条件才会匹配。如果当前系统日期不是2023年4月,日期条件就会过滤掉所有符合aid和side的记录,导致更新0行。
修正方案
方案1:匹配所有已完成的aid+side记录(无日期限制)
如果需求是只要status表中存在相同aid和side且completed=1的记录就更新,直接去掉日期条件即可:
UPDATE a1 SET code = 365 WHERE EXISTS ( SELECT 1 FROM status WHERE status.aid = a1.aid AND status.side = a1.side AND status.completed = 1 );
执行该语句后,就能得到预期的输出结果。
方案2:匹配特定年月的记录
如果确实需要匹配指定年月的status记录(比如上个月),可以直接指定年月值进行测试,或者确保系统日期的年月与status表的目标记录匹配:
UPDATE a1 SET code = 365 WHERE EXISTS ( SELECT 1 FROM status WHERE status.aid = a1.aid AND status.side = a1.side AND status.year = 2023 AND status.month = 3 AND status.completed = 1 );
内容的提问来源于stack exchange,提问作者atc
相关产品推荐
相关产品推荐

