#sql-server #sql-order-by #adventureworks
#sql-server #sql-order-by #adventureworks
Вопрос:
Я использую AdventureWorks2019 для практики. Я хочу выбрать 10 лучших значений FirstName
столбца внутри Person.Person
таблицы, после получения значений я хочу отсортировать их по возрастанию.
Когда я попытался выбрать 10 лучших значений, я получил результат:
Syed
Catherine
Kim
Kim
Kim
Hazem
Sam
Humberto
Gustavo
Pilar
Я хочу отсортировать их по:
Catherine
Gustavo
Hazem
Humberto
Kim
Kim
Kim
Pilar
Sam
Syed
Это то, что я пробовал, но потерпел неудачу:
select top 10 [FirstName] from Person.Person order by [FirstName];
и
select * from
(select top 10 [FirstName] from Person.Person) as persons
order by [FirstName];
и
with persons as (select top 10 [FirstName] from Person.Person)
select * from persons order by [FirstName];
Ответ №1:
Если вы не укажете an ORDER BY
, sql server вернет значения в любом удобном порядке, нет гарантии, что они останутся неизменными при последующих исполнениях. Таким образом, a TOP(x)
без an ORDER BY
обычно бессмысленно, потому что эти x могут быть любыми x строками.
Если вы действительно хотите отсортировать эти случайные 10 строк, вам следует использовать вложенный запрос, как вы это делали. Вы можете видеть, что sql server может свободно выбирать любой порядок, который он считает нужным, потому что вы не сказали ему, что хотите.
Если вы действительно, действительно хотите отсортировать эти строки, вы можете попробовать сначала вставить их во временную таблицу или табличную переменную. Но опять же, я подозреваю, что вы обнаружите, что sql server выберет 10 разных строк.
Хороший способ визуализировать это (вроде) — посмотреть на план выполнения: «нет ORDER BY
» означает «нет sort
«, поэтому строки отображаются в том порядке, в котором они входят (помимо этого, все становится немного мифическим).
Комментарии:
1. Спасибо! Это заставляет меня задуматься о ссылочном типе на языках ООП (C #, Java …)