带DISTINCT的ORDER BY给出ORA-01791:不是SELECTED表达式

时间:2019-04-07 06:33:18

标签: sql oracle

我试图通过select语句使用oracle order,但是会导致异常:

  

ORA-01791:不是SELECTED表达式。

 select distinct usermenu.menuname
 from   usermenu, userpermission
 where  userpermission.menuno = usermenu.menuno 
 and    userpermission.userno = 1
 order by userpermission.menuno;

1 个答案:

答案 0 :(得分:1)

DISTINCT语句的列列表中有SELECT或聚合函数时,ORDER BY不在SELECT列列表中的列将不起作用。

这是一个基于斯科特模式的示例。

尽管没有选择D.LOC,这仍然可以:

SQL> select d.dname, e.ename
  2  from dept d join emp e on e.deptno = d.deptno
  3  order by d.loc;

DNAME          ENAME
-------------- ----------
SALES          BLAKE
SALES          TURNER
SALES          ALLEN
SALES          MARTIN
SALES          WARD
SALES          JAMES
RESEARCH       SCOTT
RESEARCH       JONES
RESEARCH       SMITH
RESEARCH       ADAMS
RESEARCH       FORD
ACCOUNTING     KING
ACCOUNTING     MILLER
ACCOUNTING     CLARK

14 rows selected.

现在,添加DISTINCT-基本上,这就是您拥有的:

SQL> select distinct d.dname, e.ename
  2  from dept d join emp e on e.deptno = d.deptno
  3  order by d.loc;
order by d.loc
         *
ERROR at line 3:
ORA-01791: not a SELECTed expression

聚合函数(例如COUNT)也是如此:

SQL> select d.dname, e.ename, count(*)
  2  from dept d join emp e on e.deptno = d.deptno
  3  group by d.dname, e.ename
  4  order by d.loc;
order by d.loc
         *
ERROR at line 4:
ORA-00979: not a GROUP BY expression


SQL>

那该怎么办?按其他顺序。另外,也可以将当前查询用作内联视图,并将其与包含要对结果进行排序的列的表结合起来,然后工作

SQL> select x.dname, x.ename
  2  from (select distinct d.dname, e.ename
  3        from dept d join emp e on e.deptno = d.deptno
  4       ) x
  5       join dept d1 on d1.dname = x.dname
  6  order by d1.loc;

DNAME          ENAME
-------------- ----------
SALES          TURNER
SALES          JAMES
SALES          BLAKE
SALES          WARD
SALES          MARTIN
SALES          ALLEN
RESEARCH       SMITH
RESEARCH       FORD
RESEARCH       ADAMS
RESEARCH       SCOTT
RESEARCH       JONES
ACCOUNTING     MILLER
ACCOUNTING     KING
ACCOUNTING     CLARK

14 rows selected.

SQL>