powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Работает ли subquery в order by
10 сообщений из 10, страница 1 из 1
Работает ли subquery в order by
    #39945965
endy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Очень хочется понять природу subquery в order by. Ниже два примера.

В первом примере в order by я просто указываю 1 и информация сортируется по первому столбцу в select листе.

select first_name, sum(salary) from employees
group by first_name
order by 1 desc;

во втором примере вместо 1 я добавляю subquery результат которого как раз возвращает 1.

select first_name, sum(salary) from employees
group by first_name
order by (select min(1) from dual) desc;

Дело в том что когда я просто указываю 1 информация действительное сортируется по первому столбцу, а когда я подставляю значение '1' через subquery, результат не сортируется.
Может кто то объяснить почему происходит именно так?
Заранее спасибо.
...
Рейтинг: 0 / 0
Работает ли subquery в order by
    #39945976
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Order by 1" - всего лишь синтаксический сахар, парсер заменит это на "order by field1".
Для выражений вроде приведенного подобного фокуса не предусмотрено - оно останется выражением, возвращающим ключ сортировки, а не индекс элемента select-list.
...
Рейтинг: 0 / 0
Работает ли subquery в order by
    #39946150
endy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

Спасибо, большое понял.

Вообще subquery работает только в select-list, from и where насколько я понял.
В group by subquery тоже не работает?
...
Рейтинг: 0 / 0
Работает ли subquery в order by
    #39946156
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
endy
andrey_anonymous,

Спасибо, большое понял.


Ничего ты не понял. ЛИТЕРАЛ в ORDER BY задает сортировку по номеру выражения в select-list. Все остальное - поле, переменная, выражениe (включая выражениe из литералов, e.g. 1+1), subquery сортирует по значению этого поля, переменной, выражения, subquery ... Subquery разрешена есс-но возвращающая <= 1 строки. Например, сортируем SCOTT.EMP по местoположению отдела:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
select  *
  from  emp e
  order by (select loc from dept d where d.deptno = e.deptno)
/

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

14 rows selected.

SQL>



А вот с GROUP BY обломс - группируем зряплату по местoположению отдела:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select  sum(sal)
  from  emp e
  group by (select loc from dept d where d.deptno = e.deptno)
/
  group by (select loc from dept d where d.deptno = e.deptno)
            *
ERROR at line 3:
ORA-22818: subquery expressions not allowed here


SQL>



SY.
...
Рейтинг: 0 / 0
Работает ли subquery в order by
    #39946236
endy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot SY#22114589]
endy
andrey_anonymous,

Subquery разрешена есс-но возвращающая <= 1 строки.


Спасибо большое за информацию. Я новичок поэтому у меня появился еще один вопрос.
Вы имеете ввиду один столбец или все таки одну строку? Так как я протестировал в базе данных на таблице employees. В подзапросе, который я приведу ниже столбец location_id возвращает один столбец, но много строк, но не смотря на это order by все же сортирует информацию.

select location_id from departments - этот запрос выдает много строк.

И если использовать такой запрос приведенный ниже, то order by сортирует строки независимо от того что подзапрос выдал не одну строку а больше, но один столбец.

select * from employees e
order by (select location_id from departments d where e.department_id=d.department_id);

Спасибо заранее что помогаете.
...
Рейтинг: 0 / 0
Работает ли subquery в order by
    #39946247
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
endy

В подзапросе, который я приведу ниже столбец location_id возвращает один столбец, но много строк, но не смотря на это order by все же сортирует информацию.

select location_id from departments - этот запрос выдает много строк.

И если использовать такой запрос приведенный ниже, то order by сортирует строки независимо от того что подзапрос выдал не одну строку а больше, но один столбец.

select * from employees e
order by (select location_id from departments d where e.department_id=d.department_id);



Ну и где подзапрос выдал > 1 строки? Причем тут select location_id from departments когда подзапрос select location_id from departments d where e.department_id=d.department_id? Поле department_id в таблице departments есть PK (primary key), т.е. значение department_id в таблице departments уникально и select location_id from departments d where e.department_id=d.department_id в принципе не может выдать > 1 строки . для любойстроки из таблицы employees.

SY.
...
Рейтинг: 0 / 0
Работает ли subquery в order by
    #39946368
endy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

Я не утверждаю что я прав, просто хочу понять. Если посмотреть обе таблицы employees и departments, то как вы правильно заметили строки одинаковые, но в любом случае e.department_id=d.department_id не ограничивает количество строк в аутпуте, так как в каждом из столбцом сравниваются все строки. Например:

Department со значением 90 в таблице Employees = Department со значением 90 в таблице Departments.
Также, равны друг другу и все остальные строки.
d.department 30=e.department 30
d.department 150=e.department 150 и т.д.

В этом случае в аутпуте вернется много строк. Можно еще проверить это с помощью set оператору union:

select department_id from departments
union
select department_id from employees;

Этот запрос выдаёт также много строк.
...
Рейтинг: 0 / 0
Работает ли subquery в order by
    #39946429
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для тех кто в танке:

Код: plsql
1.
2.
select * from employees e
order by (select location_id from departments d where e.department_id=d.department_id);



означает для каждой строки (сотрудника) выбранной из таблицы employees мы выполняем подзапрос, т.e. находим location_id отдела в котором работает этот cотрудник. Естественно подзапрос вернет <= 1 строку. Eще раз - подзапрос выполняется не один раз (забудь про оптимизацию) a столько раз сколько строк возвращает основной запрос и каждое выполнение подзапросa должно вернуть (и в данном случае возвращает) <= 1 строку.

SY.
...
Рейтинг: 0 / 0
Работает ли subquery в order by
    #39946514
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Для тех кто в танке:

Код: plsql
1.
2.
select * from employees e
order by (select location_id from departments d where e.department_id=d.department_id);



означает для каждой строки (сотрудника) выбранной из таблицы employees мы выполняем подзапрос, т.e. находим location_id отдела в котором работает этот cотрудник. Естественно подзапрос вернет <= 1 строку. Eще раз - подзапрос выполняется не один раз (забудь про оптимизацию) a столько раз сколько строк возвращает основной запрос и каждое выполнение подзапросa должно вернуть (и в данном случае возвращает) <= 1 строку.

SY.


проще пояснить если сортировать не по ид а по имени
... order by (select DEPARTMENT_NAME from departments d ...

.....
stax
...
Рейтинг: 0 / 0
Работает ли subquery в order by
    #39946529
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
endy,

1 - позиция

(select min(1) from dual) выражение


считаете что во втором случае выражение из ордер бай добавлено в селект лист
аля
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
  1  select ename, sum(sal) sum_sal,(select min(1) from dual) srt from emp
  2  group by ename
  3* order by 3 desc
SQL> /

ENAME         SUM_SAL
---------- ----------
ALLEN            1600
JONES            2975
FORD             3000
CLARK            2450
MILLER           1300
SMITH             800
JAMES             950
MARTIN           1250
SCOTT            3000
TURNER           1500
ADAMS            1100
BLAKE            2850
KING             5000
WARD             1250

14 rows selected.



если указано число (литерал/константа) то это позиция (номер поля в селекте)

order by 1 - сортировка по первому полю
order by 2-1 - сортировка по выражению (так как константа то не будет сортировки)

....
stax
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Работает ли subquery в order by
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]