Сохраняет ли ROW_NUMBER () OVER (ORDER BY (SELECT NULL)) порядок? - PullRequest
2 голосов
/ 08 января 2020

Я планирую использовать ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) в запросах на выборку, у которых нет соответствующих столбцов данных для использования в предложении order-by.

Как правило, ROW_NUMBER() будет упорядочено одинаково с каждым выполнение, если я использую ORDER BY с действительными данными столбца. Используя ORDER BY (SELECT NULL), какой будет порядок ROW_NUMBER(), будет ли он меняться с каждым исполнением?

Если порядок не меняется (проверено с моей стороны, порядок не меняется), хорошо ли это использовать?

Ответы [ 3 ]

3 голосов
/ 08 января 2020

Без явного предложения ORDER BY вы можете получить разные ROW_NUMBER() для конкретной строки c при разных исполнениях. То же самое с ORDER BY (SELECT NULL), который является либо хаком для обхода требований синтаксиса, либо синтаксисом c sugar; ордер не исполняется.

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

1 голос
/ 08 января 2020

Вы отметили вопрос MySQL. Но вы использовали излишне загадочный синтаксис. MySQL поддерживает обе эти конструкции:

ROW_NUMBER() OVER ()
ROW_NUMBER() OVER (ORDER BY NULL)

В обоих случаях вы говорите: «Мне все равно, каков порядок». Очень важное следствие:"Мне все равно, если результат будет одинаковым при двух разных прогонах одного и того же запроса.

Если честно, ROW_NUMBER() не гарантированно вернет тот же результат, когда ключи ORDER BY одинаковы. Почему? Потому что SQL таблицы и наборы результатов представляют неупорядоченные наборы. Не существует порядка по умолчанию для возврата.

Ваш конкретный синтаксис является обходным решением для SQL Сервера, поскольку для этой базы данных требуется условие ORDER BY для ROW_NUMBER() и SQL Сервер не допускает константы в ORDER BY.

Конечно, точно те же условия выполняются в этой базе данных - или в любой другой базе данных.

Простой ответ: Нет, вы не можете предполагать, что результат будет в том же порядке, если вы снова выполните тот же запрос.

0 голосов
/ 08 января 2020

Выполнение ORDER BY (SELECT NULL) всегда возвращает тот же порядок, что и выполнение обычной таблицы.

...