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后出现的。

通常是因为distinctorder by 一起使用,因为字段名称冲突报错。

上面的SQL报错是因为order by后使用的字段名称,使用的是原始名称report.ftransactiondate,不是使用别名“transactionDate”所导致的。

也就是说,如果有distinct时,order by后面跟的字段名称,必须是最新的别名(若没有别名,就使用原来的名称,若有多层子查询,则使用最新的那个别名);

上面错误修改:

order by report.ftransactiondate desc;

改为

order by "transactionDate" desc;

这样就可以执行成功了。

distinct使用注意点:

1.必须放在查询字段最前面 (若不出最前面,会报错:表达式缺失)

2.distinct后面有多个查询字段时,当这多个字段完全不同时,才算是重复记录,予以剔除

如果查询多个字段,只想给第一个字段去重,那么这样做是不可以的

3.distinctorder 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 表达式”。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值