ORDER BY с DISTINCT дает ORA-01791: не SELECTed выражение

Я пытаюсь использовать порядок оракула с помощью инструкции select, но это вызывает исключение:

ORA-01791: not a SELECTed expression.

 select distinct usermenu.menuname
 from   usermenu, userpermission
 where  userpermission.menuno = usermenu.menuno 
 and    userpermission.userno = 1
 order by userpermission.menuno;
"не работает правильно" вовсе не является постановкой проблемы. Расскажите нам четко, что не работает. Также добавьте образцы данных и ожидаемый результат, а также результат, который вы получаете в настоящее время. Не добавляйте их как комментарии, редактировать ваш вопрос.
Kaushik Nayak 07.04.2019 08:40

Вы пробовали: order by usermenu.menuno? Кроме того, я считаю, что столбцы order by также должны отображаться в списке select.

Abra 07.04.2019 08:40

Вы заказываете по userpermission.menuno, но это не столбец выбранной проекции.

Ely 07.04.2019 08:51

см. глубоко заявление, то вы оштрафованы.

Mirwais Faizi 07.04.2019 08:55
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
794
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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>

Спасибо, дорогой, но как решить этот оператор выбора, который я пытаюсь решить, но это не работает. пожалуйста, помогите мне в этом примере.

Mirwais Faizi 07.04.2019 11:16

Я даже не могу начать объяснять, как много значила для меня твоя помощь.

Mirwais Faizi 07.04.2019 12:15

Другие вопросы по теме