powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Изменение порядка записей в зависимости от положения коррелированных подзапросов
19 сообщений из 19, страница 1 из 1
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39250574
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть два запроса:
#1
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with x as (
	select t.*,
			(select ... ) a,
			(select ... ) b,
			(select ... ) c
		from t
		order by ...
)
select *
	from x
	where rownum <= 1000

#2
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with x as (
	select t.*
		from t
		order by ...
)
select x.*,
		(select ... ) a,
		(select ... ) b,
		(select ... ) c
	from x
	where rownum <= 1000


Коррелированные подзапросы a, b и c по сути зависят только от таблицы t (хотя, выбирают данные из других таблиц, само собой).
Фраза ORDER BY одинакова в обоих запросах.
Деревья планов одинаковые (статистика, само собой разная)..
Но почему строки возвращаются в разном порядке?
Я думал, TOP-N выборки сохраняют сортировку..
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39250616
--Eugene--Я думалджоин, пусть и неявный через скалярный подзапрос, не обязан возвращать строки какой либо из объединяемых таблиц в исходном порядке.
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39250636
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--Но почему строки возвращаются в разном порядке?
Я думал, TOP-N выборки сохраняют сортировку..

order by надо указывать во внешнем запросе, в подзапросе без top это вообще не имеет никакого смысла.
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39250637
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivorder by надо указывать во внешнем запросе, в подзапросе без top это вообще не имеет никакого смысла.
Иногда лучше жевать, чем говорить.
У автора во "внешнем" ограничение на rownum.
Что до причин неожиданного поведения - то лучше бы автору представить testcase, абстрактно угадать сложно.
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39250647
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

тесткейс предоставить чересчур сложно. это всё внутри пакета, stacktrace совсем не детский, и т.п., но я постараюсь..
скажите, вы согласны про скалярный аннест? - ведь что получается, во внешнем TOP-N запросе вообще не может быть подобной корреляции?
и главное, из каких официальных источников об этом узнать?
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39250650
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--Я думал, TOP-N выборки сохраняют сортировку..
А почему, собственно? Единственный способ в SQL обеспечить порядок записей - использование
кляузы ORDER BY. В её отсутствие, этот порядок - артефакт реализации, полагаться на
который нельзя.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39250688
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--,

Неужели порядок противоречит order by?
Или различие в следующих столбцах?
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39250711
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА почему, собственно? ROWNUM Pseudocolumn
поэтомуIf you embed the ORDER BY clause in a subquery and place the ROWNUM condition in the top-level query, then you can force the ROWNUM condition to be applied after the ordering of the rows. For example, the following query returns the employees with the 10 smallest employee numbers. This is sometimes referred to as top-N reporting :
Код: sql
1.
2.
3.
SELECT *
  FROM (SELECT * FROM employees ORDER BY employee_id)
  WHERE ROWNUM < 11;
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39250712
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--If you embed the ORDER BY clause in a subquery and place the ROWNUM condition in the
top-level query, then you can force the ROWNUM condition to be applied after the ordering
of the rows. For example, the following query returns the employees with the 10 smallest
employee numbers. This is sometimes referred to as top-N reporting:

И в каком месте этой цитаты ты увидел что-то о сортировке выходного набора?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39250713
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

они бы не стали рекомендовать такую конструкцию (ROWNUM over ORDER BY) не гарантируя сохранение порядка сортировки.
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39250716
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--они бы не стали рекомендовать такую конструкцию (ROWNUM over ORDER BY) не гарантируя
сохранение порядка сортировки.

Почему? Её задача "вывести Х записей подлежащего НД". В каком порядке - совершенно пох.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39250726
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
--Eugene--вы согласны про скалярный аннесточень сомневаюсь... во-первых, он появился только с 12с, во-вторых, была бы разница в планах.
А с чего вообще взяли, что разница была? И где планы, которые якобы одинаковы?
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39250730
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВ каком порядке - совершенно пох.То есть, тот запрос в примере должен вернуть 10 сотрудников с наименьшим ID, однако, не обязательно по порядку от меньшего до большего? Откуда такая информация?
В таком случае слово Reporting в термине TOP-N Reporting совсем бессмысленно..
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39250735
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--Dimitry SibiryakovВ каком порядке - совершенно пох.То есть, тот запрос в примере должен вернуть 10 сотрудников с наименьшим ID, однако, не обязательно по порядку от меньшего до большего? Откуда такая информация?
В таком случае слово Reporting в термине TOP-N Reporting совсем бессмысленно..

ваш второй запрос не отвечает формальным признакам TOP-N query в обсуждаемом смысле.

первый и второй запрос лишь случайно могут показать один и тот же результат
первый - TOP-N, в принятом в экосистеме oracle терминологии, а второй - нет .

Штуки вроде order by или TOP-N относятся к последней фазе - выдаче результата запроса клиенту.
содержимое - сами данные - к этому моменту полностью сформированы.
Если нет - вы не можете полагаться на order by или top-n

У вас во втором запросе продолжается вычисление полей для результирующего набора.
Этого самого по себе достаточно для игнорирования order by планировщиком запроса, независимо
от присутствия rownum.

во втором запросе у вас сказано - дай мне 100 все равно каких строк, я тут от воодушевления еще order by пририсовал,
но ты же, oracle, понимаешь, что мне #асрать на него, так как я знаю что делаю - я вычисляю (продолжаю вычислять)
вертикальные секции своих данных после него, потому делай с ним что хочешь - мне он не нужен.
мне просто 1000 строк, если найдешь - подай.

если вы троль - то примите поздравления - два дня активного обсуждения - это победа.
если нет, то, как вариант - прекратите цитировать документацию oracle - сначала прочитайте любые книжки про sql вообще, не про oracle .
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39250741
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

вы инкриминируете мне троллинг, не приводя никаких материалов, знать которые, по-вашему, я должен со школы.
если ваши слова не домыслы, вы могли бы их подтвердить официальными.

и откуда такая ненависть?
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39251023
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--booby,
...если ваши слова не домыслы, вы могли бы их подтвердить официальными.

Он не помнит.
19242649
Но не уверен на 100% что неправ.

А потому будет креативить:

boobyШтуки вроде order by или TOP-N относятся к последней фазе - выдаче результата запроса клиенту.
содержимое - сами данные - к этому моменту полностью сформированы.
Если нет - вы не можете полагаться на order by или top-n

до морковкина заговения.
На практические демо он ответит околонаучным теоретизированием, на теоретические рассуждения - сообщит, что не интересуется сферическими марсианскими конями.

Не тратьте время.
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39251268
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И правда, планы разные.. (куда я смотрел?..)
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39251570
kaldorey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу немного обобщить, чтобы уложить получше. Оракл у меня будет какое-то время отсутствовать, сам проверить пока не могу, но запомнить сие хочется.
1) Получается, упорядоченный набор строк остается таковым, пока не потребуется использовать в запросе другие неупорядоченные данные?
2) Если кроме/вместо rownum использовать фильтр для запроса #1, например WHERE a > 10, порядок останется?
3) Если также для запроса #1
Код: plsql
1.
2.
3.
4.
select x1.*
from x x1,
     x x2
where x1.id = x2.id


останется ли порядок?
4) Этот принцип не зависит от планов или переписывания запросов оптимизатором, иначе все полетело бы к чертям (до сих пор бывает встречаю код, использующий такое поведение), значит, что-то логически заложенное (преднамеренно/непреднамеренно - от этого зависит, стоит ли полагаться на это, или могут изменить со следующим патчем)
5) С введением аналитических функций это теперь не слишком востребовано должно быть? Какие цели у такого запроса могут быть еще?

Заранее прошу прощения за возможную тупость вопросов
...
Рейтинг: 0 / 0
Изменение порядка записей в зависимости от положения коррелированных подзапросов
    #39253063
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оказалось, сортировка была неуникальная..
Добавил в конце ORDER BY .. t.rowid в обоих запросах, и всё встало на свои места.

Так что сортировка в TOP-N запросах работает (даже при корреляции на верхнем уровне).
Или вы скажете, совпадение? - не думаю
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Изменение порядка записей в зависимости от положения коррелированных подзапросов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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