执行UPDATE查询遇类型匹配错误:integer与boolean无法匹配
解决UPDATE查询中子查询返回多行的错误
嘿,我来帮你搞定这个UPDATE的问题~你的查询触发错误主要有两个原因,我先给你拆解清楚,再给你靠谱的解决方案:
你的查询问题出在哪?
- CASE逻辑写错了:你在CASE里写了
client.capital = compte.solde,这是个布尔判断(返回true/false),不是你要的赋值操作,应该直接写compte.solde才对。 - 子查询没和外层关联:你的子查询没有限定只返回当前更新的客户对应的账户数据,导致它会返回所有有账户的客户记录,UPDATE的时候数据库不知道该用哪一行的值,自然就报“子查询返回多于一行”的错了。
方案1:用LEFT JOIN做UPDATE(推荐,高效直观)
这种方式直接通过关联表来更新,能覆盖所有客户(包括没有账户的):
UPDATE client LEFT JOIN client_compte ON client.client_id = client_compte.client_id LEFT JOIN compte ON client_compte.compte_num = compte.compte_num SET client.capital = COALESCE(compte.solde, 0);
为啥这么写?
LEFT JOIN会保留所有client的记录,哪怕这个客户没有对应的账户关联。COALESCE(compte.solde, 0)是个好用的函数:如果客户有账户,就用账户的solde值;如果没有,就自动用0,完全符合你的需求。
方案2:用关联子查询的方式
如果你更习惯用子查询,记得一定要把子查询和外层的client关联起来,确保每个客户只返回自己的账户数据:
UPDATE client SET capital = ( SELECT COALESCE(c.solde, 0) FROM client_compte cc LEFT JOIN compte c ON cc.compte_num = c.compte_num WHERE cc.client_id = client.client_id LIMIT 1 -- 要是一个客户可能有多个账户,这里限制取一个;如果要总和,就改成SUM(c.solde) );
这里的关键是WHERE cc.client_id = client.client_id,它把子查询的结果和当前正在更新的客户绑定,避免返回多行。
小提示
改完之后别急着执行,先跑个SELECT验证一下结果对不对:
SELECT client.client_id, client.capital, COALESCE(compte.solde, 0) AS new_capital FROM client LEFT JOIN client_compte ON client.client_id = client_compte.client_id LEFT JOIN compte ON client_compte.compte_num = compte.compte_num;
这样能提前确认逻辑没问题,再去执行UPDATE就稳啦~
内容的提问来源于stack exchange,提问作者SkippyDingleChalk
相关产品推荐
相关产品推荐

