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

使用INNER JOIN关联多表更新Warehouse时返回错误值的技术问询

解决Warehouse表按国家更新平均成本的问题

嘿,你的处理方法确实有点绕啦!咱们来拆解下问题,然后给你个更简洁高效的解决方案。

原代码的问题分析

你遇到的Subquery returns more than 1 row错误,根源在于SET子句里的子查询没有和外层的Warehouse行做关联——它会返回所有国家的平均值,自然会有多行结果。而加LIMIT 1虽然能避免报错,但会把所有Warehouse行都更新成同一个平均值,完全达不到“每个国家对应更新”的需求。另外,你嵌套了多层不必要的子查询(比如SELECT * FROM Warehouse AS wh),把逻辑复杂化了。

简洁的解决方案

这里有两种更清晰的写法,都能实现你的需求:

方法1:用JOIN关联预计算的平均值表(推荐,效率更高)

先计算每个国家代码的平均成本,再通过JOIN关联Warehouse表完成更新:

UPDATE Warehouse
INNER JOIN (
    -- 预先计算每个国家代码(取country字段前两位)的平均出库成本
    SELECT 
        LEFT(`country`, 2) AS country_code,
        AVG(`outbound-cost-pal`) AS avg_outbound_cost
    FROM `warehouse-cost-table`
    GROUP BY LEFT(`country`, 2)
) AS cost_summary ON Warehouse.`location-tariff-code` = cost_summary.country_code
SET Warehouse.`outbound-cost-pal` = cost_summary.avg_outbound_cost;

方法2:用相关子查询

针对Warehouse的每一行,动态匹配对应的平均成本(适合数据量不大的场景):

UPDATE Warehouse
SET `outbound-cost-pal` = (
    -- 针对当前Warehouse行的国家代码,查询对应的平均成本
    SELECT AVG(`outbound-cost-pal`)
    FROM `warehouse-cost-table`
    WHERE LEFT(`country`, 2) = Warehouse.`location-tariff-code`
)
-- 可选:只更新有对应成本数据的行,避免无数据的行被设为NULL
WHERE EXISTS (
    SELECT 1
    FROM `warehouse-cost-table`
    WHERE LEFT(`country`, 2) = Warehouse.`location-tariff-code`
);

为什么这两种方法能行?

  • 方法1先通过子查询一次性计算好所有国家的平均成本,再和Warehouse表关联,这样每一行Warehouse都能精准匹配到对应的平均值,不会出现多行结果的问题,而且效率更高。
  • 方法2用相关子查询,每次只针对当前Warehouse行的国家代码查询平均值,自然只会返回单个值,不会触发Subquery报错。

内容的提问来源于stack exchange,提问作者anthony

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:39:43