我有下面的查询(实际上用作更大查询集的派生表),当我使用外括号运行下面的查询时,我收到 ORA-00979 错误,但是如果我运行查询without外括号运行良好。
( 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 B.COST_DATE DESC NULLS LAST )
但是,如果我运行不带外括号的查询,它运行得很好
我真的很怀疑。这是使用
all_objects
表的查询问题的简化可重现示例:
select o.owner, max(o.object_id) as object_id
from all_objects o
group by o.owner
order by o.object_id;
这将返回
not a GROUP BY expression
,因为 o.object_id
指的是表列,而不是所选输出中的第 2 列。
如果您只是从最后一行删除表别名,它就可以正常工作,因为现在
object_id
指的是结果中的第 2 列:
select o.owner, max(o.object_id) as object_id
from all_objects o
group by o.owner
order by object_id;
在您的示例中,您应该从
B.
中删除 B.COST_DATE
,将最后一行更改为:
ORDER BY COST_DATE DESC NULLS LAST )
正如 Thorsten 在评论中提到的,避免创建与表中列同名的列别名是一个很好的做法,以避免这样的混淆。