Oracle按SEQ映射CodeSequence插入CodeStatement报too many values错误
错误原因
SQL抛出too many values错误的核心原因有两点:
- CASE表达式语法误用:CASE是逐行返回单个值的表达式,你在每个WHEN分支中嵌套了返回5个字段的子查询,相当于试图在单个字段位置塞入多列数据;同时子查询未加任何关联过滤条件,会直接返回CodeSequence表的全量多行结果,和INSERT语句要求的列数完全不匹配,触发报错。
- 核心聚合逻辑缺失:原写法没有对同一CODE下的多条SEQ记录做合并,逐行扫描CodeSequence表输出结果,就算语法修正,也会给每个CODE插入4条零散记录,达不到“同一CODE的4条SEQ记录合并为一行”的需求。
修正方案
从字段类型VARCHAR2可以判断使用的是Oracle数据库,采用条件聚合实现行转列即可满足需求:按CODE字段分组,将不同SEQ对应的DESCRIPTION映射到目标列,每个CODE最终仅返回1行数据,列数和目标表CodeStatement完全匹配,不会出现值数量不匹配问题。
INSERT INTO CodeStatement (CODE, STATEMENT_DESC1, STATEMENT_DESC2, STATEMENT_DESC3, STATEMENT_DESC4) SELECT CODE, MAX(CASE WHEN SEQ = 1 THEN DESCRIPTION END) AS STATEMENT_DESC1, MAX(CASE WHEN SEQ = 2 THEN DESCRIPTION END) AS STATEMENT_DESC2, MAX(CASE WHEN SEQ = 3 THEN DESCRIPTION END) AS STATEMENT_DESC3, MAX(CASE WHEN SEQ = 4 THEN DESCRIPTION END) AS STATEMENT_DESC4 FROM CodeSequence GROUP BY CODE;
说明:如果同一个CODE下的同一个SEQ值仅对应唯一一条DESCRIPTION记录,用MAX/MIN聚合都可以正确取到非空的描述值;如果某个CODE缺失对应SEQ的记录,目标STATEMENT_DESC列会自动填入NULL,符合预期。
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

