SAP HANA执行SQL报[305]单行查询返回多行错误咨询
报错原因分析
SAP HANA 报错SAP DBTech JDBC: [305]: single-row query returns more than one row的本质是:需要返回仅1行结果的场景中,查询实际返回了超过1行数据。结合你提供的SQL语句,触发报错的常见原因如下:
你提供的报错SQL:
SELECT DISTINCT CASE WHEN FLAG1 = 'FALSE' AND FLAG2 = 'FALSE' THEN '99Z' ELSE (CASE WHEN FLAG1 = 'FALSE' THEN TGK2 ELSE TGK1 END) END FROM ( SELECT DISTINCT CASE WHEN FLAG1 = 'FALSE' THEN '99Z' ELSE 'X'||CAMPO28||'_'||'Y'||CAMPO29 END AS TGK1, CASE WHEN FLAG2 = 'FALSE' THEN '99Z' ELSE (CASE WHEN CAMPO15 IS NULL THEN '99Z' ELSE CAMPO15 END) END AS TGK2, FLAG1,FLAG2 FROM (SELECT CASE WHEN CAMPO1 IN ( SELECT DISTINCT LEFT(COD_CONTO,7) FROM CONTO_GERARCHIA_ABBI WHERE COD_CONTO_GERARCHIA = 'H14' AND (COD_CONTO LIKE '3%' OR COD_CONTO LIKE '4%') UNION ALL SELECT DISTINCT LEFT(COD_CONTO,10) FROM CONTO_GERARCHIA_ABBI WHERE COD_CONTO_GERARCHIA = 'H14' AND (COD_CONTO LIKE '1%' OR COD_CONTO LIKE '2%')) AND CAMPO27 = 'ZZ' THEN CAMPO1 ELSE 'FALSE' END AS FLAG1, CASE WHEN CAMPO1 IN ( SELECT LEFT(COD_CONTO,7) FROM CONTO_GERARCHIA_ABBI WHERE COD_CONTO_GERARCHIA = 'H10' ) THEN CAMPO1 ELSE 'FALSE' END AS FLAG2, CAMPO15, CAMPO28, CAMPO29, CAMPO1 FROM MAP_DATI_ACQUISITI WHERE 1=1 AND COD_MAPPATURA = '100' AND COD_IMPORT = '010' ) GROUP BY FLAG1, FLAG2, CAMPO15, CAMPO28, CAMPO29, CAMPO1 )
具体触发原因
- 查询被用在了单行返回场景:你当前的SQL本身会返回多行符合条件的结果,如果这段SQL被放在了仅允许单行结果的位置,比如SELECT子句的标量字段位置、等于号
=的右侧、赋值给变量的场景,就会直接触发该报错。 - 分组逻辑生成多余行:内层子查询的GROUP BY字段包含
CAMPO15、CAMPO28、CAMPO29,如果同一个CAMPO1对应多组不同的上述字段值,就会生成多条分组结果,最终导致外层查询返回多行。 - IN子查询未去重:FLAG1的IN子查询使用了
UNION ALL,不会对上下两段查询的结果去重,如果存在重复匹配值,会导致同一条MAP_DATI_ACQUISITI表记录匹配到多条结果,间接生成多余行。
解决方案
- 若你需要将该查询结果作为标量值使用,先确认业务逻辑是否允许多个返回值:允许多值的话将外层的等于匹配改为IN匹配;仅允许单值的话在最外层SELECT添加
TOP 1,或者用MAX/MIN这类聚合函数包裹最终返回的字段,确保仅返回1行结果。 - 将IN子查询中的
UNION ALL改为UNION,对匹配值去重,避免重复匹配生成多余行。 - 检查GROUP BY字段是否合理,移除不必要的分组字段,调整逻辑避免生成多余的分组行。
内容的提问来源于stack exchange,提问作者Miriam
相关产品推荐
相关产品推荐

