SQL跨表插入报错:子查询返回多行的解决方案咨询
解决子查询返回多行的INSERT语句优化问题
你的问题根源在于嵌套的子查询没有和主查询的行建立关联,导致它每次都会返回所有符合WHERE条件的行,这就触发了“subquery has more than one value”的报错。而且根据你补充的业务规则(每个R2IGTNo只会对应三个重量列中的一个非空值),我们完全不需要用子查询,直接在主查询里处理拼接逻辑即可。
修改后的查询语句
INSERT INTO dbo.tblCrucibleLdgDtls (R2IGTNo, TotalMtrlWgt) SELECT R2IGTNo, RTRIM(LTRIM(CONCAT(ULTotalS1S2MtrlWgt, ULTotalS3S4MtrlWgt, ULTotalS5S6MtrlWgt))) AS TotalMtrlWgt FROM dbo.tbl1RMWeighingDetails WHERE R2IGTNo LIKE '%C%' AND (ULTotalS1S2MtrlWgt IS NOT NULL OR ULTotalS3S4MtrlWgt IS NOT NULL OR ULTotalS5S6MtrlWgt IS NOT NULL)
为什么这样改?
- 去掉冗余子查询:直接在主查询的SELECT列表里完成拼接,避免了子查询返回多行的问题。
- 贴合业务规则:根据你说的
R2IGTNo和重量列的对应关系,每个行只会有一个重量列有值,CONCAT函数会自动忽略NULL值(将其视为空字符串),所以拼接结果正好是你需要的单个有效重量值。 - 保留过滤条件:把原查询子查询里的非空判断移到主查询的WHERE子句中,确保只处理有有效重量值的行。
这样修改后,既保证了每行都能获取到对应的唯一TotalMtrlWgt值,又不会出现子查询返回多行的报错,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Shankar Naren
相关产品推荐
相关产品推荐

