带外层括号的派生查询触发ORA-00979错误,无括号则正常
ORA-00979错误排查:派生表GROUP BY问题分析
问题核心原因
这段SQL单独执行正常,但作为派生表(外层加括号)时触发ORA-00979: not a GROUP BY expression错误,根源在于Oracle对子查询/派生表的ORDER BY解析逻辑和独立查询不同:
- 独立查询时,Oracle允许ORDER BY引用未出现在SELECT列表的原始列(比如这里的
B.COST_DATE),哪怕它不在GROUP BY中——因为ORDER BY是在聚合完成后执行,Oracle能关联到原始表的列。 - 但作为派生表时,Oracle会将整个子查询视为一个临时数据集,此时ORDER BY里的
B.COST_DATE不属于这个数据集的输出列(SELECT列表里只有TO_CHAR(MAX(B.COST_DATE)) COST_DATE,不是原始的B.COST_DATE),且该列未包含在GROUP BY中,因此被判定为无效的GROUP BY表达式。
解决方案
将ORDER BY子句改为引用SELECT列表中的别名或列位置序号即可:
- 方案1:引用别名
COST_DATE(推荐,可读性更强) - 方案2:引用列位置序号
3(对应SELECT列表的第三列)
修正后的SQL
( SELECT A.INVENTORY_ITEM_ID ,C.SUBINVENTORY_CODE, TO_CHAR(MAX(B.COST_DATE)) COST_DATE, to_char(B.TRANSACTION_COST,'FM99990.90') TRANSACTION_COST FROM CST_ONHAND_V A, CST_ITEM_COST_HISTORY_V B, CST_TXN_LAYER_DTLS_V C WHERE 1=1 AND A.INVENTORY_ITEM_ID= :p_inv_num AND A.REC_TRXN_ID=B.TRANSACTION_ID AND A.COST_ORG_ID = B.COST_ORG_ID AND A.COST_BOOK_ID = B.COST_BOOK_ID AND A.INVENTORY_ITEM_ID=B.INVENTORY_ITEM_ID GROUP BY A.INVENTORY_ITEM_ID ,C.SUBINVENTORY_CODE ,to_char(B.TRANSACTION_COST,'FM99990.90') ORDER BY COST_DATE DESC NULLS LAST )
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

