Как отсортировать верхнюю часть N записей после выбора?

#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

Ответ №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 …)