powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как сэкономить на втором ORDER BY для ROW_NUMBER() ?
7 сообщений из 7, страница 1 из 1
Как сэкономить на втором ORDER BY для ROW_NUMBER() ?
    #40135699
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую!

Такой вопрос: надо, чтобы отсортированный запрос в одной колонке бы сообщал номер строки в отсортированной выдаче.
Решил таком вот способом (смотри ниже), но немного напрягает необходимость в ROW_NUMBER() OVER(...) повтрять весь список из ORDER BY запроса.
Есть ли возможность без вкладывания всего запроса в подзапрос (и далее через ROWNUM) как-нибудь красиво избавиться от дублирования перечисления отсортированных полей? Oracle 19

Заранее спасибо.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT
   ROW_NUMBER() OVER (ORDER BY a,b,func_C(...),d,e) as order_id,
   ...
FROM 
   ...
ORDER BY
   a,
   b,
   func_C(...),
   d,
   e 
...
Рейтинг: 0 / 0
Как сэкономить на втором ORDER BY для ROW_NUMBER() ?
    #40135703
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что нагуглил, надо же что бывает
Код: plaintext
ROW_NUMBER() OVER (ORDER BY NULL)

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:9537769800346072683
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT
   ROW_NUMBER() OVER (ORDER BY NULL) as order_id,
   ...
FROM 
   ...
ORDER BY
   ...



Результат вроде то что надо
...
Рейтинг: 0 / 0
Как сэкономить на втором ORDER BY для ROW_NUMBER() ?
    #40135706
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён

Вот что нагуглил, надо же что бывает
...
Результат вроде то что надо


гарантировано ли ето?

я б не рисковал

.....
stax
...
Рейтинг: 0 / 0
Как сэкономить на втором ORDER BY для ROW_NUMBER() ?
    #40135720
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT
   ROW_NUMBER() OVER (ORDER BY a,b,func_C(...),d,e) as order_id,
   ...
FROM 
   ...
ORDER BY order_id
...
Рейтинг: 0 / 0
Как сэкономить на втором ORDER BY для ROW_NUMBER() ?
    #40135734
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT
   ROW_NUMBER() OVER (ORDER BY a,b,func_C(...),d,e) as order_id,
   ...
FROM 
   ...
ORDER BY order_id

если бы еще групп бай так :(
...
Рейтинг: 0 / 0
Как сэкономить на втором ORDER BY для ROW_NUMBER() ?
    #40135866
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
провёл тест предложенного AmKad варианта order by ORDER_ID, у него такой же план, как и у мной нагугленного с OVER (ORDER BY NULL)

запрос пока ещё без колонки ORDER_ID
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select k.ID, k.name1, k.name2 
from kunde k
order by k.name1, k.name2;
-------------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes |TempSpc| Cost (%CPU)|
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       | 29981 |   819K|       |   885   (1)|
|   1 |  SORT ORDER BY     |       | 29981 |   819K|  1184K|   885   (1)|
|   2 |   TABLE ACCESS FULL| KUNDE | 29981 |   819K|       |   649   (1)|
-------------------------------------------------------------------------




Вообще интересно, что ниже у всех запросов с колонкой ORDER_ID одинаковый план запроса.
Сервер догадался, что речь об одном и том же. Это впечатляет


тот код, который хотел упростить
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select k.ID, k.name1, k.name2, ROW_NUMBER() OVER (ORDER BY k.name1, k.name2) as ORDER_ID
from kunde k
order by k.name1, k.name2;
-----------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)|
-----------------------------------------------------------------
|   0 | SELECT STATEMENT   |       | 29981 |   819K|   649   (1)|
|   1 |  WINDOW SORT       |       | 29981 |   819K|   649   (1)|
|   2 |   TABLE ACCESS FULL| KUNDE | 29981 |   819K|   649   (1)|
-----------------------------------------------------------------




два варианта упрощения
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
select k.ID, k.name1, k.name2, ROW_NUMBER() OVER (ORDER BY NULL) as ORDER_ID
from kunde k
order by k.name1, k.name2;
-----------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)|
-----------------------------------------------------------------
|   0 | SELECT STATEMENT   |       | 29981 |   819K|   649   (1)|
|   1 |  WINDOW SORT       |       | 29981 |   819K|   649   (1)|
|   2 |   TABLE ACCESS FULL| KUNDE | 29981 |   819K|   649   (1)|
-----------------------------------------------------------------


select k.ID, k.name1, k.name2, ROW_NUMBER() OVER (ORDER BY k.name1, k.name2) as ORDER_ID
from kunde k
order by ORDER_ID;
-----------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)|
-----------------------------------------------------------------
|   0 | SELECT STATEMENT   |       | 29981 |   819K|   649   (1)|
|   1 |  WINDOW SORT       |       | 29981 |   819K|   649   (1)|
|   2 |   TABLE ACCESS FULL| KUNDE | 29981 |   819K|   649   (1)|
-----------------------------------------------------------------
...
Рейтинг: 0 / 0
Как сэкономить на втором ORDER BY для ROW_NUMBER() ?
    #40135938
Melkomyagkii_newbi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо
Кроик Семёнвкладывания всего запроса в подзапрос (и далее через ROWNUM)
понятней
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как сэкономить на втором ORDER BY для ROW_NUMBER() ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (5): Анонимы (4), Yandex Bot 1 мин.
Пользователи онлайн (9): Анонимы (6), Yandex Bot 1 мин., Bing Bot 1 мин., RePredeclared 2 мин.
x
x
Закрыть


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