Ответ 1
Тройка Row_Number() OVER (ORDER BY (SELECT 1))
НЕ должна рассматриваться как способ избежать изменения порядка базовых данных. Это всего лишь средство избежать того, чтобы сервер выполнял дополнительную и ненужную сортировку (он все равно может выполнять сортировку, но это будет стоить минимальной возможной суммы по сравнению с сортировкой по столбцу).
Все запросы на сервере SQL АБСОЛЮТНО ДОЛЖНЫ иметь предложение ORDER BY
в самом внешнем запросе, чтобы результаты были надежно упорядочены с гарантированным способом.
Концепция "сохранения исходного порядка" не существует в реляционных базах данных. Таблицы и запросы всегда должны считаться неупорядоченными до тех пор, пока в самом внешнем запросе не будет указано предложение ORDER BY
.
Вы можете попробовать один и тот же неупорядоченный запрос 100 000 раз и всегда получать его с тем же заказом, и, таким образом, полагаете, что можете положиться на указанное упорядочение. Но это было бы ошибкой, потому что в один прекрасный день что-то изменится, и у него не будет ожидаемого порядка. Например, когда база данных обновляется до новой версии SQL Server, это вызвало много запросов, чтобы изменить порядок их размещения. Но это не должно быть большим изменением. Что-то вроде добавления или удаления индекса может привести к различиям. И еще: установка пакета обновления. Разбиение таблицы. Создание индексированного представления, которое включает соответствующую таблицу. Достижение некоторой точки опроса, когда вместо поиска выбирается сканирование. И так далее.
Не полагайтесь на результаты, которые вы хотите заказать, если вы не сказали "Сервер, ORDER BY
".