You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行UPDATE查询遇类型匹配错误:integer与boolean无法匹配

解决UPDATE查询中子查询返回多行的错误

嘿,我来帮你搞定这个UPDATE的问题~你的查询触发错误主要有两个原因,我先给你拆解清楚,再给你靠谱的解决方案:

你的查询问题出在哪?

  1. CASE逻辑写错了:你在CASE里写了client.capital = compte.solde,这是个布尔判断(返回true/false),不是你要的赋值操作,应该直接写compte.solde才对。
  2. 子查询没和外层关联:你的子查询没有限定只返回当前更新的客户对应的账户数据,导致它会返回所有有账户的客户记录,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:09:17