Операторы ORDER BY и TOP в SQL по-разному работают при перечислении записей и почему? - PullRequest
0 голосов
/ 04 июля 2019

Я использую таблицу CITY из моей базы данных с названиями городов ниже.Названия городов: Дели, Мумбаи, Патна, Виджаявада, Панаджи, Тируванантапурам, Ченнаи и Калькутта.

ЗАКАЗАТЬ ПО:

Select NAME from CITY ORDER BY LEN(NAME)

Выход: Дели, Патна, Панаджи, Мумбаи, Калькутта, Ченнаи, Виджаявада, Тируванантапурам

ТОП 3 и ЗАКАЗАТЬ ПО

Select TOP 3 NAME from CITY ORDER BY LEN(NAME)

Выход: Дели, Патна, Мумбаи

Myвопрос здесь, почему не Дели, Патна и Панаджи.Почему топ 3 выбирает четвертый элемент вместо третьего?

Ответы [ 2 ]

3 голосов
/ 04 июля 2019

Это связано с тем, что Panaji и Mumbai имеют длину 6 символов, и оба они соответствуют третьей позиции в предложении TOP 3.SQL Server может свободно возвращать Панаджи или Мумбаи, не нарушая критериев ORDER BY, и нет абсолютно никакой гарантии, какой город он вернет в любой момент времени.

Для обработки связей вы можете явно указать дополнительные критерии в предложении ORDER BYнапример:

ORDER BY LEN(name), name -- order by length
                         -- if there is a tie then by name
0 голосов
/ 04 июля 2019

Это было одной из причин, по которой ключевое слово WITH TIES было введено вместе с предложением TOP.

Без использования ключевого слова вы получите случайные результаты для результатов, по которым вы нашли совпадение. Как вы видите здесь, Мумбаи и Панаджи имели одинаковую длину, поэтому любой из них мог быть возвращен. При использовании ключевого слова вы могли бы увидеть 4 результата (оба они включены).

...