SQL UPDATE语句中待更新记录的筛选条件应放在什么位置?
错误原因
你写的报错语句把筛选条件错放在了SET子句的赋值语句后,SQL解析时会把AND param='1'识别为赋值表达式的一部分——相当于尝试给param字段赋值「子查询返回结果 逻辑与 param='1'」的布尔值,和你原本的赋值逻辑冲突,自然会报错。
筛选条件的正确位置
针对待更新行的筛选规则,需要放在UPDATE语句末尾的WHERE子句中,这部分逻辑的作用是提前过滤出符合要求的行,再对这些行执行SET后的赋值操作,不会干扰字段赋值的逻辑。
满足你需求的正确SQL语句如下:
UPDATE table2 SET param = ( SELECT param1 FROM table1 WHERE table1.name = table2.name AND table1.date = table2.date ) WHERE param = '1';
如果后续需要适配更新原值为2、3等其他指定值的场景,只需要修改WHERE子句中param对应的匹配值即可,比如要更新原值为3的记录,直接把最后一行改成WHERE param = '3'就行。
可选优化
如果你的业务场景中,可能存在table1里找不到对应name+date匹配记录的情况,上面的写法会把table2中符合筛选条件但匹配不到table1数据的行的param字段更新为NULL。如果要避免这个问题,可以加上存在性校验,只更新能在table1中找到匹配数据的行:
UPDATE table2 SET param = ( SELECT param1 FROM table1 WHERE table1.name = table2.name AND table1.date = table2.date ) WHERE param = '1' AND EXISTS ( SELECT 1 FROM table1 WHERE table1.name = table2.name AND table1.date = table2.date );
注意:不要把
param='1'这个条件写到SET后面的关联子查询内部,那样只会修改子查询的匹配规则,无法实现「仅更新table2中原param值为指定值的记录」的需求。
内容的提问来源于stack exchange,提问作者Martin Kuchen
相关产品推荐
相关产品推荐

