Oracle查詢錯誤分析:ORA-01791:不是SELECTed表示式
表結構如下:
create table HH_BOOK_GOOD
(
ID VARCHAR2(32) not null,
BOOKID VARCHAR2(32) not null,
GOODID VARCHAR2(32) not null,
GOODPRICE FLOAT not null,
GOODNAME VARCHAR2(256) not null,
GOODNOTE VARCHAR2(1024) not null
)
使用下面語句進行查詢
select distinct ID,BOOKID,GOODPRICE from HH_BOOK_GOOD order by GOODID;
報ORA-01791:不是SELECTed表示式
原因是order by
後面的GOODID
欄位不在select
查詢結果欄位之中,因為使用了distinct
關鍵字。
解決方法
1、將此欄位加入到select
之後
select distinct ID,BOOKID,GOODPRICE,GOODID from hh_book_good order by GOODID;
2、如果覺得GOODID
欄位是多餘的,實在是不想將它查詢出來,可修改為如下:
select ID,BOOKID,GOODPRICE
from(select distinct ID,BOOKID,GOODPRICE,GOODID from HH_BOOK_GOOD)
order by GOODID;
ORA-01791:not a Selected expression不是一個查詢表示式報錯問題
原始報錯sql:
SELECT DISTINCT report.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 ASSIGN
WHERE report.fid = ASSIGN.fktransactionreportid
AND ASSIGN.fkpersonid = person.fid) AS "ppsum",
To_char(report.ftransactiondate, 'yyyy-MM-dd') AS
"transactionDate"
FROM t_hr_person person
left join t_trade_commissionassign ASSIGN
ON person.fid = ASSIGN.fkpersonid
left join t_trade_transactionreport report
ON ASSIGN.fktransactionreportid = report.fid
WHERE 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
後使用的欄位名稱,使用的是原始名稱report.ftransactiondate
,不是使用別名“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 表示式
”。
相關文章
- Oracle分組查詢中包含子查詢列,發生ORA-00937:不是單分組函式的錯誤Oracle函式
- mysql慢查詢和錯誤日誌分析MySql
- 日誌查詢錯誤
- delphi 查詢av錯誤地址
- DMSFrame 之查詢表示式用法(一)
- 華納雲:linux系統中如何查詢oracle錯誤日誌LinuxOracle
- PostgreSQL Like查詢與正規表示式SQL
- C# Lambda表示式和linq表示式 之 匿名物件查詢接收C#物件
- ORACLE 錯誤Oracle
- 從Oracle 11.2.0.4 BUG到Oracle子查詢展開分析Oracle
- Oracle 查詢Oracle
- ef8 Contains 查詢條件 報錯 $ 附近錯誤AI
- 正規表示式查詢相似單詞的方法
- Oracle psu查詢Oracle
- oracle 基本查詢Oracle
- oracle常用查詢Oracle
- PostgreSQL 原始碼解讀(164)- 查詢#84(表示式求值)SQL原始碼
- oracle 精確查詢和模糊查詢Oracle
- Go 錯誤處理新思路?用左側函式和表示式Go函式
- C++編譯錯誤的正確查詢方式C++編譯
- 正規表示式中 “$” 並不是表示 “字串結束字串
- cpp查錯誤
- MySQL入門系列:查詢簡介(三)之表示式和函式MySql函式
- Oracle-多表查詢Oracle
- oracle 連線查詢Oracle
- Oracle 查詢轉換Oracle
- oracle樹形查詢Oracle
- Oracle in 查詢優化Oracle優化
- group by 和 order by 一起使用,報錯 ORA-00979:不是 GROUP BY 表示式
- DB2字符集,查詢中文錯誤DB2
- WEBAPI單據查詢介面提示比較符67錯誤WebAPI
- 解決jpa查詢時,Unable to locate Attribute with the the given name錯誤
- PostgreSQL 原始碼解讀(31)- 查詢語句#16(查詢優化-表示式預處理#1)SQL原始碼優化
- PostgreSQL 原始碼解讀(32)- 查詢語句#17(查詢優化-表示式預處理#2)SQL原始碼優化
- PostgreSQL 原始碼解讀(33)- 查詢語句#18(查詢優化-表示式預處理#3)SQL原始碼優化
- PostgreSQL 原始碼解讀(34)- 查詢語句#19(查詢優化-表示式預處理#4)SQL原始碼優化
- 「Oracle」Oracle高階查詢介紹Oracle
- WEBAPI單據查詢介面FilterString支援直接填寫SQL表示式WebAPIFilterSQL