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

INSERT语句中子查询结果无法插入及多返回行报错求助

问题分析与解决方案

核心问题

你的INSERT语句中嵌套的子查询没有关联当前插入的记录,而是从gb.uträckning全表中查询匹配objekttyp = t2.lägenhetstyp的行:

  • 当表中存在多条匹配行时,子查询返回多行,触发"Subquery returns more than 1 row"错误;
  • 即使子查询返回单行,也是表中已有旧数据的计算结果,而非当前插入行对应的值,这就是无报错但值无法正确插入的原因。

修正后的单条INSERT语句

将原VALUES子句改为INSERT ... SELECT形式,直接绑定当前插入的参数进行计算,避免子查询范围错误:

INSERT INTO `gb.uträckning`(of_bostäder_objekt, typ_av_objekt, objekttyp, antal_kvm, relativt_hyrestal_bastal)
SELECT
  22105859,
  'B',
  'B2K',
  64,
  -- 用CASE替代多层IF,提升可读性
  IF('B' IN ('B', 'NyB'), 
     64 + (SELECT 
             CASE 1
               WHEN 1 THEN t2.`2`
               WHEN 2 THEN t2.`1`
               WHEN 3 THEN t2.`3`
               ELSE t2.`2`
             END
           FROM `nh.lägenhetstyp` t2
           WHERE t2.lägenhetstyp = 'B2K'),
     NULL)

适配批量处理的触发器实现

如果要在触发器中实现多行批量插入的自动计算,需要使用NEW关键字获取当前插入行的字段值,确保每行都能基于自身数据计算结果:

DELIMITER //
CREATE TRIGGER trg_gb_utrackning_before_insert
BEFORE INSERT ON `gb.uträckning`
FOR EACH ROW
BEGIN
  SET NEW.relativt_hyrestal_bastal = 
    IF(NEW.typ_av_objekt IN ('B', 'NyB'),
       NEW.antal_kvm + (SELECT 
                          CASE NEW.balkong_uteplats_saknas
                            WHEN 1 THEN t2.`2`
                            WHEN 2 THEN t2.`1`
                            WHEN 3 THEN t2.`3`
                            ELSE t2.`2`
                          END
                        FROM `nh.lägenhetstyp` t2
                        WHERE t2.lägenhetstyp = NEW.objekttyp),
       NULL);
END //
DELIMITER ;

触发器说明

  • 使用BEFORE INSERT触发器,在数据插入前自动计算并赋值relativt_hyrestal_bastal字段;
  • NEW关键字代表当前正在插入的行,通过它可以获取该行的所有字段值,确保计算逻辑与当前行绑定;
  • 用CASE WHEN替代多层嵌套IF,逻辑更清晰,便于维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:01:12