MySQL:UPDATE JOIN语句中WHERE子句的正确放置位置
正确的UPDATE JOIN加WHERE子句写法分析
先直接给你结论:你尝试的第二种写法是完全正确的,这符合SQL标准中UPDATE JOIN语句的语法顺序。
正确写法
UPDATE usr_time_reg JOIN users ON usr_time_nr = usr_time_reg.usr_time_nr SET usr_time_reg.usr_employment = users.employment WHERE usr_time_reg.usr_employment = "Övrigt";
这个语句的执行逻辑是:先将usr_time_reg和users表按指定的连接条件关联,然后只更新那些usr_time_reg.usr_employment等于"Övrigt"的行,把它们的usr_employment字段替换为users表中对应行的employment值。
其他写法的问题分析
我们逐个看你尝试的其他写法哪里不对:
第一种写法
UPDATE usr_time_reg JOIN users ON usr_time_nr = usr_time_reg.usr_time_nr, usr_time_reg.usr_employment = "Övrigt" SET usr_time_reg.usr_employment = users.employment;错误原因:你把过滤条件直接放到了
ON子句后面用逗号分隔,这不符合SQL语法规范。ON子句只能用来定义表与表之间的连接条件,过滤行的条件不能这么添加,执行时会直接触发语法错误。第三种写法
UPDATE usr_time_reg JOIN users ON usr_time_nr = usr_time_reg.usr_time_nr WHERE usr_time_reg.usr_employment = "Övrigt" SET usr_time_reg.usr_employment = users.employment;错误原因:SQL中UPDATE语句的语法顺序是
UPDATE ... JOIN ... SET ... WHERE ...,你把WHERE子句放到了SET子句前面,顺序完全颠倒了,这会导致数据库无法解析语句,触发语法错误。第四种写法
UPDATE usr_time_reg JOIN users ON usr_time_nr = usr_time_reg.usr_time_nr AND usr_time_reg.usr_emplyment = "Övrigt" SET usr_time_reg.usr_employment = users.employment;这里有两个问题:
- 拼写错误:
usr_emplyment少写了一个字母o,应该是usr_employment,执行时会提示“列不存在”的错误; - 逻辑偏差:把过滤条件放到
ON子句里,会变成连接条件的一部分——数据库只会关联那些满足连接条件且usr_employment等于"Övrigt"的行,这和你想要的“先关联所有符合连接条件的行,再过滤出需要更新的行”逻辑不一致,可能会漏掉一些本该被更新的行。
- 拼写错误:
内容的提问来源于stack exchange,提问作者Björn C
相关产品推荐
相关产品推荐

