Неожиданное поведение SQL с помощью запроса SELECT TOP - PullRequest
0 голосов
/ 10 ноября 2019

Я использую Microsoft SQL Server 2019 и при выполнении:

SELECT TOP 10 *
FROM  WideWorldImporters.Sales.Invoices

SELECT TOP 10 CustomerID
FROM  WideWorldImporters.Sales.Invoices

Это дает результаты:

enter image description here

Это неверно, потому что это не «10 лучших» идентификаторов клиентов, отображаемых в первом запросе.

Полный снимок экрана: enter image description here

Редактировать: Поведение, которое я ожидал выше, соответствует тому, что фактически происходит в SQL Sever 2014. Я подозреваю, что они изменили базовую реализацию в SQL Server 2019, хотя все еще удовлетворяют задокументированному поведению.

Ответы [ 4 ]

5 голосов
/ 10 ноября 2019

ТОП без ORDER BY непредсказуем. Это задокументировано Microsoft. От Документы Microsoft :

Когда вы используете TOP с предложением ORDER BY, результирующий набор ограничивается первым N числом упорядоченных строк. В противном случае TOP возвращает первое число N строк в неопределенном порядке.

...

В операторе SELECT всегда используйте предложение ORDER BY с предложением TOP. Потому что это единственный способ предсказуемо указать, на какие строки влияет TOP.

См. Также как работает SELECT TOP, если не указан порядок по?

4 голосов
/ 10 ноября 2019

Это слишком долго для комментария.

В SQL записи таблицы неупорядочены . По этой причине запрос, подобный вашему:

SELECT TOP 10 * FROM  WideWorldImporters.Sales.Invoices

... будет давать противоречивые результаты, поскольку в нем отсутствует предложение ORDER BY. Вы должны сообщить своей СУБД, какой столбец следует использовать для упорядочения записей, чтобы можно было определить, какие TOP записи должны быть возвращены. Например, что-то вроде:

SELECT TOP 10 * FROM  WideWorldImporters.Sales.Invoices ORDER BY InvoiceID DESC
4 голосов
/ 10 ноября 2019

У вас нет ORDER BY, поэтому возвращаются первые 10 результатов по неопределенному порядку. Этот порядок может меняться от одного выполнения к следующему.

Таблицы в SQL представляют неупорядоченные наборы. Если вы хотите, чтобы определенные строки использовали TOP, вам нужно иметь ORDER BY.

0 голосов
/ 12 ноября 2019

Этот результат абсолютно нормальный, так как в вашем запросе не указан порядок. Верхние 10 возвращают первые 10 результатов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...