11 ORA系列:ORA-01791: 不是 SELECTed 表达式(distinct使用注意点)
not a Selected expression:不是一個查詢表達式;
原始報錯sql:
select distinctreport.fid as "reportId",-- assign.fassigntype as "type",report.fsalestatus as "saleStatus",report.ftransactionstatus as "transactionStatus",report.fsettleaccountstatus as "settleAccountStatus",report.ftenementdetail as "tenementDetail",person.fid as "personId",person.fname as "personName",-- 上數業績,分成比例(select sum(assign.fprice) || '| ' || sum(assign.fproportion)from t_trade_commissionassign assignwhere report.fid = assign.fktransactionreportidand assign.fkpersonid = person.fid) as "ppsum",to_char(report.ftransactiondate,'yyyy-MM-dd') as "transactionDate"from t_hr_person personleft join t_trade_commissionassign assign on person.fid=assign.fkpersonidleft join t_trade_transactionreport report on assign.fktransactionreportid=report.fidwhere 1=1 and person.fid = '90481a8d-0c05-4002-9532-26e0482a96af' and to_char(report.ftransactiondate,'yyyy-MM-dd') >= '2017-10-24'order by report.ftransactiondate desc;
通常ORA-01791--的錯誤,都是在使用distinct后出現的。
通常是因為distinct和order by 一起使用,因為字段名稱沖突報錯。
上面的SQL報錯是因為order by后使用的字段名稱,使用的是原始名稱,不是使用別名“transactionDate”所導致的。
也就是說,如果有distinct時,order by后面跟的字段名稱,必須是最新的別名(若沒有別名,就使用原來的名稱,若有多層子查詢,則使用最新的那個別名);
上面錯誤修改:
order by report.ftransactiondate desc;改為
order by "transactionDate" desc;這樣就可以執行成功了。
distinct使用注意點:
1.必須放在查詢字段最前面 (若不出最前面,會報錯:表達式缺失)
2.distinct后面有多個查詢字段時,當這多個字段完全不同時,才算是重復記錄,予以剔除
如果查詢多個字段,只想給第一個字段去重,那么這樣做事不可以的
3.distinct與order by連用時,order by后面的排序字段名,必須是最新的字段名稱或別名。
?Oracle 9i數據庫,執行下面語句出現錯誤“ORA-01791: 不是 SELECTed 表達式”:select distinct t.name from auth_employee t order by t.auth_employee_id asc
?????? 原來:SELECT語句中含有DISTINCT關鍵字或者有運算符時,排序用字段必須與SELECT語句中的字段相對應。
??????? 網上搜到解釋如下:在ORDER BY中指定多個列,結果將先按照子句中的第一列排序,然后第二個,依此類推。?
??????? 在SELECT中未出現的列名也可用于ORDER BY 子句中,只要TABLE中有就行。但如果SELECT子句中出現了DISTINCT關鍵字,則只能用出現過的列名,而且如果SELECT子句中使用了任何運算符,在ORDER BY 子句中必須保持和SELECT子句中表達式完全一致,否則出現錯誤:“ORA-01791: 不是 SELECTed 表達式”。
總結
以上是生活随笔為你收集整理的11 ORA系列:ORA-01791: 不是 SELECTed 表达式(distinct使用注意点)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中Date与String的相互转
- 下一篇: Oracle中concat与||区别(以