2015-12-22 2 views
3

У меня есть запрос T-SQL к таблице, где мне нужна вершинная строка. В MySQL это работает так, как ожидалось, но в SQL Server я получаю разные возвращенные данные, что довольно озадачивает.Ключевое слово SQL Server TOP возвращает разные результаты

Я приложил три снимка экрана: 1 из таблицы, 1 из данных, возвращенных при просмотре только 10 верхних строк и 1 из данных, возвращаемых при просмотре 1000 строк. Вы заметите, что самая верхняя строка содержит различную информацию для столбца между двумя запросами.

Единственная разница в запросе, являющемся значением счета ключевого слова TOP. В этой таблице содержится 7 строк данных. Результат с Top 1000 содержит правильный порядок возвращаемых строк. Что тут происходит?

Почему SQL Server меняет порядок возвращаемых строк в зависимости от значения count ключевого слова TOP? Может ли кто-нибудь объяснить или предоставить способ сохранить это соответствие независимо от того, сколько строк возвращается?

Table design

Top 10

Top 1000

+3

Это называется недетерминирующим заказом. Вам нужно добавить тай-брейк, I.e. порядок по номеру товара в конце. –

ответ

0

Чтобы добавить некоторый контекст в этом вопросе, я пытался достичь согласованности между MySQL и MSSQL в упорядочении возвращаемых строк. Я конвертирую проект, который использовал MySQL для MSSQL, и это создало проблему для меня. Решение, чтобы получить то, что я хочу, было использовать Set Rowcount 1, чтобы ограничить количество возвращенных строк. Это создало 1 строку данных, которая была заказана так же, как MySQL.

+0

Независимо от платформы dbms, в SQL все наборы «неупорядочены», пока вы не примените предложение ORDER BY. Предполагать, что что-либо еще приведет к ошибкам и/или различиям (как вы видели). Хорошим примером является GROUP BY, который в MySQL имеет «внешний вид» для создания упорядоченного результата, поэтому некоторые люди не беспокоятся об ORDER BY; это небезопасно и может разочаровать. Таким образом, вы MySQL-код, возможно, сделал предположение, что MSSQL не применяется. & NB: Если вам требуется TOP (n) из MSSQL, вы ДОЛЖНЫ применять заказ для получения согласованных результатов –

6

Там нет никакой разницы или вопрос в выводе. Вы заказываете по ширине и первые 2 ширины одинаковы и не имеют каких-либо суб упорядоченность поэтому оставляет решение до RDBMS (его оптимизатор запросов специально) представить whichever first

Вы должны также добавить itemNumber к вашему ORDER BY пункт после Width

ORDER BY Width, itemNumber 
6

Order by является не гарантируется давать одинаковый результат при равных значениях в виде таблиц SQL представляют собой неупорядоченные наборы. И так как ваша ширина одинакова, вы получаете разные результаты.

Для получения уникального результата или для стабилизации сортировки вам необходимо добавить название столбца, например itemNumber, в ваш пункт order by.

Смежные вопросы