Хотя наблюдения до сих пор были верны для следующего, этот ответ никоим образом не является окончательным. @Catcall и я, оба, не смогли найти ничего определенного в документации, и я должен признать, что мне лень разбираться и разбираться с исходным кодом.
Но ради наблюдений учтите следующее:
SELECT * FROM (select * from foo order by bar) foobar;
Запрос должен вернуть заказано .
SELECT * FROM vw_foo; -- where vw_foo is the sub-select above
Запрос должен вернуть заказанный .
SELECT * FROM vw_foo LEFT JOIN (select * from bar) bar ON vw_foo.id = bar.id;
Запрос должен использовать его по своему усмотрению и может вернуть неупорядоченный .
Отказ от ответственности:
Как и @Catcall, вы никогда не должны зависеть от какой-либо неявной сортировки, так как много раз она будет оставлена на усмотрение движка базы данных. Базы данных рассчитаны на скорость и надежность; они часто взаимодействуют с памятью и пытаются вытащить / протолкнуть данные как можно быстрее. Однако упорядочение не основано исключительно на управлении памятью , есть несколько факторов, которые участвуют.
Если вы не имеете в виду что-то конкретное, вам следует выполнить сортировку в конце (по внешнему запросу).
Если вышеупомянутое наблюдение было верным, что-то вроде следующего всегда должно приводить результаты в правильном порядке:
SELECT *
FORM (select trunc(random()*999999+1) as i
from generate_series(1,1000000)
order by i
) foo;
Простой процесс будет следующим: выполнить предварительную обработку и выполнить идентификацию запроса (определить, существует ли порядок), запустить цикл, извлечь первое поле (сгенерировать случайное число), добавить в выходной стек в отсортированном порядке. Упорядочение также может происходить в конце генерации стека, а не во время (например, составить список и затем выполнить сортировку). Это зависит от версии и запроса.