场景:
场景:查询表单数据中的申请人的职级,并将申请人和职级去重,且按照单据日期排序
问题描述:
查询报错:ORA-01791: 不是 SELECTed 表达式
代码:
SELECT DISTINCT A.STAFF 申请人,
S.STDNAME 申请人名称,
ra.STDCODE 申请人职级代码,
ra.STDNAME 申请人职级,
A.EXECUTIVE 代理高管,
g.stdname 高管名称,
sg.rank 高管职级,
r.STDCODE 高管职级代码,
r.STDNAME 高管职级名称,
A.BILLCODE 单据编号,
-- A.BILLTIME 单据日期,
A.UNITID
FROM FO_ACCOUNTBILL A--报销单
LEFT JOIN MD_STAFF S--职员
ON A.STAFF=S.RECID
LEFT JOIN SJ_RANK ra--职级
ON S.RANK=ra.RECID
LEFT JOIN SJ_AGENTEXECUTIVE g--高管配置表
ON A.EXECUTIVE=g.RECID
LEFT JOIN MD_STAFF Sg--高管
ON g.EXECUTIVE=Sg.RECID
LEFT JOIN SJ_RANK r--高管职级
ON Sg.RANK=r.RECID
WHERE A.billcode LIKE 'SR%'
AND TO_CHAR(A.BILLTIME,'yyyymm')>'201812'
AND A.EXECUTIVE IS NULL
ORDER BY A.staff,A.BILLTIME DESC;
ORA-01791: 不是 SELECTed 表达式
01791. 00000 - "not a SELECTed expression"
*Cause:
*Action:
行 1 列 607 出错
原因分析:
问题的分析:
SELECT语句中含有DISTINCT关键字或者有运算符时,排序用字段必须与SELECT语句中的字段相对应。在SELECT中未出现的列名也可用于ORDER BY 子句中,只要TABLE中有就行。但如果SELECT子句中出现了DISTINCT关键字,则只能用出现过的列名,而且如果SELECT子句中使用了任何运算符,在ORDER BY 子句中必须保持和SELECT子句中表达式完全一致,否则出现错误:“ORA-01791: 不是 SELECTed 表达式”。
解决方案:
解决方案:
将排序字段加入查询字段中,或者将排序字段去掉。