执行指定SQL语句时提示‘too many values’错误的原因是什么?
嘿,这个问题我太熟了!你碰到的too many values错误根源其实特别清晰——NOT IN子句里的列数和左边要匹配的列数完全不搭。
你仔细看这段SQL:主查询里写的是MATNR NOT IN (...),也就是想用单个列MATNR去和子查询的结果做匹配,但你的子查询select MATNR, HKL from SONDER_AUFTRAG where GREIFLOK = 'J'返回了两个列(MATNR和HKL)。数据库直接懵了:我到底该拿子查询里的哪一列和左边的MATNR对比?这不就直接报“值太多”的错误了嘛。
接下来给你两种修正方向,对应不同的业务需求:
情况1:需要同时排除MATNR和HKL都匹配的记录
这种场景下,用NOT EXISTS比多列NOT IN更靠谱(还能避免NULL值带来的逻辑坑),修改后的SQL如下:
select MATNR, HKL from( select MATNR, HKL from BESTAND where LOK_NR >1 and BEST_FREI =0 union select MATNR, HKL from BESTAND where LOK_NR =1 and BEST_FREI >0 ) t WHERE NOT EXISTS ( select 1 from SONDER_AUFTRAG sa where sa.GREIFLOK = 'J' and sa.MATNR = t.MATNR and sa.HKL = t.HKL ) GROUP BY MATNR, HKL ORDER BY MATNR, HKL;
情况2:只需要排除MATNR出现在子查询里的记录
那直接把子查询改成只返回MATNR列就行,这样两边列数就完全匹配了:
select MATNR, HKL from( select MATNR, HKL from BESTAND where LOK_NR >1 and BEST_FREI =0 union select MATNR, HKL from BESTAND where LOK_NR =1 and BEST_FREI >0 ) t WHERE MATNR NOT IN( select MATNR from SONDER_AUFTRAG where GREIFLOK = 'J' ) GROUP BY MATNR, HKL ORDER BY MATNR, HKL;
内容的提问来源于stack exchange,提问作者Emjot
相关产品推荐
相关产品推荐

