最近遇到一个表的的问题,就是由于批量处理错误,把一个表的某个字段的删除掉了,现在解决方案是通过另一个表对应的一个字段进行补充。自己尝试一个个去填,但是发现一千多个根本查不过来(折腾了一两个小时才完成了10%的部分)。所以想到如何批量操作,那还要用SQL来解决。
大致的思路是
就是A 表的 b字段现在为空,但是可以通过 A表的的c字段关联C表c字段,通过C表中的b字段来回填A表中的b字段。
UPDATE a aas
LEFT JOIN b ae ON ae.id = a.employee_id
SET a.department_id
= b.department_id
WHERE
aas.id IN(
select a.id from ams_asset a WHERE a.employee_id is NOT null AND a.department_id is NULL
)
AND aas.merchant_id =1003523
结果报错
- You can't specify target table 'aas' for update in FROM clause
我想是不是搞错了
我把aas.id in (1001) 给他一个确定的值,发现错就不保了,说明问题可能是IN里面的查找语句的问题。
搜了一下资料,这个是MySQL自己的问题,大概意思是MySQL不支持你更新某张表通过你更新的这张表范围内de
类似你更新A, 但是你是通过一个select语句来把你要修改A表的对应的id来去修改更新A,这样是不行的。
解决方法一种是你这个范围不是从A里面查出来的,另一种就是再包一层给你查询A的select语句,就是加个括号。
我们一般来说都会选择方法二
基于上个SQL进行修改添加括号抱起来,如下:
UPDATE ams_asset aas
LEFT JOIN ams_employee ae ON ae.id = aas.employee_id
SET aas.department_id
= ae.department_id
WHERE
aas.id IN(
select a.id from ams_asset a WHERE a.employee_id is NOT null AND a.department_id is NULL
)
AND aas.merchant_id =1003523
PS 以后批量数据问题优先考虑SQL,联表更新的语句,锻炼自己复杂的SQL语句能力。