Oracle执行MINUS查询时报ORA-01789列数不匹配错误求助
解决ORA-01789错误:查询块结果列数不匹配
ORA-01789错误的直接原因是MINUS运算符前后的两个查询返回的列数不一致:
- 第一个查询返回4列:
FSA_ID,NE_LENGTH,SPAN_REF_NAME,SPAN_NAME - 第二个查询仅返回3列:
FSA_ID,NE_LENGTH,FSA_UG_ACTUAL
根据你处理两列长度数据的需求,有两种修正方式:
方式1:只保留核心需求列(推荐)
如果仅需要对比FSA_ID和NE_LENGTH,可以去掉两个查询中多余的列:
SELECT RJ_FSA_ID as FSA_ID, ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH FROM NE.MV_SPAN@NE WHERE RJ_FSA_ID = 'GWLR0115' AND INVENTORY_STATUS_CODE = 'IPL' AND SPAN_REF_NAME IN ('3x40-F-RG-ST-1L','3x40-F-RG-ST-1L','3x40-F-RG-ST-1L') GROUP BY RJ_FSA_ID MINUS SELECT AA.FSA_ID as FSA_ID, AA.MAINT_ZONE_NE_SPAN_LENGTH AS NE_LENGTH FROM TBL_FIBER_INV_JOBS AA INNER JOIN TBL_FIBER_INV_JOB_PROGRESS BB ON AA.JOB_ID = BB.JOB_ID WHERE AA.FSA_ID = 'GWLR0115';
方式2:补充列数使其一致(需保留额外字段时)
如果必须保留第一个查询的4列,需要给第二个查询补充对应位置的列,用NULL填充缺失字段:
SELECT RJ_FSA_ID as FSA_ID, ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH, SPAN_REF_NAME,SPAN_NAME FROM NE.MV_SPAN@NE WHERE RJ_FSA_ID = 'GWLR0115' AND INVENTORY_STATUS_CODE = 'IPL' AND SPAN_REF_NAME IN ('3x40-F-RG-ST-1L','3x40-F-RG-ST-1L','3x40-F-RG-ST-1L') GROUP BY RJ_FSA_ID,SPAN_REF_NAME,SPAN_NAME MINUS SELECT AA.FSA_ID as FSA_ID, AA.MAINT_ZONE_NE_SPAN_LENGTH AS NE_LENGTH, NULL AS SPAN_REF_NAME, NULL AS SPAN_NAME FROM TBL_FIBER_INV_JOBS AA INNER JOIN TBL_FIBER_INV_JOB_PROGRESS BB ON AA.JOB_ID = BB.JOB_ID WHERE AA.FSA_ID = 'GWLR0115';
注意:使用MINUS时,除了列数一致,对应位置的列数据类型也需要兼容,否则会触发新的错误。
内容的提问来源于stack exchange,提问作者Nadeem
相关产品推荐
相关产品推荐

