|
Работает ли subquery в order by
|
|||
---|---|---|---|
#18+
Всем привет. Очень хочется понять природу 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, результат не сортируется. Может кто то объяснить почему происходит именно так? Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 18:23 |
|
Работает ли subquery в order by
|
|||
---|---|---|---|
#18+
"Order by 1" - всего лишь синтаксический сахар, парсер заменит это на "order by field1". Для выражений вроде приведенного подобного фокуса не предусмотрено - оно останется выражением, возвращающим ключ сортировки, а не индекс элемента select-list. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 18:43 |
|
Работает ли subquery в order by
|
|||
---|---|---|---|
#18+
andrey_anonymous, Спасибо, большое понял. Вообще subquery работает только в select-list, from и where насколько я понял. В group by subquery тоже не работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2020, 13:50 |
|
Работает ли subquery в order by
|
|||
---|---|---|---|
#18+
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.
А вот с GROUP BY обломс - группируем зряплату по местoположению отдела: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2020, 14:45 |
|
Работает ли subquery в order by
|
|||
---|---|---|---|
#18+
[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); Спасибо заранее что помогаете. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2020, 20:53 |
|
Работает ли subquery в order by
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2020, 21:17 |
|
Работает ли subquery в order by
|
|||
---|---|---|---|
#18+
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; Этот запрос выдаёт также много строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 17:12 |
|
Работает ли subquery в order by
|
|||
---|---|---|---|
#18+
Для тех кто в танке: Код: plsql 1. 2.
означает для каждой строки (сотрудника) выбранной из таблицы employees мы выполняем подзапрос, т.e. находим location_id отдела в котором работает этот cотрудник. Естественно подзапрос вернет <= 1 строку. Eще раз - подзапрос выполняется не один раз (забудь про оптимизацию) a столько раз сколько строк возвращает основной запрос и каждое выполнение подзапросa должно вернуть (и в данном случае возвращает) <= 1 строку. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 22:09 |
|
Работает ли subquery в order by
|
|||
---|---|---|---|
#18+
SY Для тех кто в танке: Код: plsql 1. 2.
означает для каждой строки (сотрудника) выбранной из таблицы employees мы выполняем подзапрос, т.e. находим location_id отдела в котором работает этот cотрудник. Естественно подзапрос вернет <= 1 строку. Eще раз - подзапрос выполняется не один раз (забудь про оптимизацию) a столько раз сколько строк возвращает основной запрос и каждое выполнение подзапросa должно вернуть (и в данном случае возвращает) <= 1 строку. SY. проще пояснить если сортировать не по ид а по имени ... order by (select DEPARTMENT_NAME from departments d ... ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 10:30 |
|
Работает ли subquery в order by
|
|||
---|---|---|---|
#18+
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.
если указано число (литерал/константа) то это позиция (номер поля в селекте) order by 1 - сортировка по первому полю order by 2-1 - сортировка по выражению (так как константа то не будет сортировки) .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 10:48 |
|
|
start [/forum/topic.php?fid=52&fpage=48&tid=1881359]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 17ms |
total: | 164ms |
0 / 0 |