2013-06-07 3 views
-1

Я хочу сортировать по столбцу в MS SQL. У меня есть таблица say Performance, которая выглядит ниже, и мое требование состоит в том, чтобы сортировать ее, что можно сделать легко, используя порядок по имени столбца, но как сохранить его навсегда отсортированным образом, я имею в виду, что я не просто хочу для просмотра отсортированных данных с помощью оператора select на самом деле я хотел сделать постоянное изменение этого представления.Сортировка или обновление таблицы с использованием порядка или любым другим способом

Marks Roll number Name 
44   5   Mike 
22   2   Robin 
44   1   Jack 
34   3   a 
22   4   b 

Ожидаемое:

22  2   Robin 
22  4   b 
34  3   a 
44  1   Jack 
44  5   Mike 
+2

Если вы хотите получить конкретный заказ, поместите ORDER BY во внешний запрос. Период. Другого пути, извините. –

ответ

4

Вы не можете. Реляционные базы данных не имеют понятия упорядочения строк в таблице. Если вы хотите упорядоченный вывод, вы должны использовать предложение ORDER BY. Это фундаментальный факт, и вы не можете работать.

В SQL Server 2000 в (по существу) ошибке Microsoft разрешала представления иметь предложение ORDER BY, которое упорядочивало вывод. Однако в SQL Server 2005 это было изменено, потому что никогда не было так правильно работать.

Вы можете попробовать трюк SELECT TOP (2147483647) * FROM dbo.Blah B ORDER BY B.Col;, но это также не сократит его в последующих версиях SQL Server. Поведение порядка TOP является побочным эффектом, а не основным эффектом, и на него не следует полагаться. Сделайте это правильно и поместите сортировку, где это должно быть: на уровне презентации или в последнем внешнем запросе, который отправлен в базу данных (ala SELECT Columns FROM dbo.View ORDER BY X;).

Чуть больше не приказывать строк в таблице: да, есть кластерные индексы, но вы не можете полагаться на данные возвращения заказаны по нескольким причинам:

  • некластеризованном индекс может быть использован для удовлетворяют запросу, поэтому упорядочение кластерного индекса не повлияет на упорядочение выходных рядов.
  • На столе не может быть кластеризованного индекса.
  • Хотя строки каждой кластерной индексной страницы меньше, чем следующая страница и больше, чем предыдущая страница, строки внутри каждой страницы сами не упорядочиваются.
  • Параллелизм может изменить порядок создания строк, поскольку один поток может вернуться быстрее или медленнее, чем другие.
  • Во время выполнения запроса, если другой процесс уже считывает некоторые строки, которые будут удовлетворять текущему запросу, эти данные могут быть заимствованы для текущего запроса не в порядке, чтобы сохранить записи (после чего текущий запрос будет выберите только оставшиеся строки, которые отсутствуют).

Существует один простой, надежный и требуется способ получить упорядоченный набор строк: ORDER BY.

+0

Еще одна пуля, которую вы могли бы добавить: кластерный индекс не всегда используется для удовлетворения запроса, и, следовательно, упорядочение индексов кластеров не повлияет на результирующий порядок вывода. На самом деле причины, о которых вы говорили, это, пожалуй, самый простой способ продемонстрировать. –

+0

Спасибо, @AaronBertrand! Хорошая точка зрения. – ErikE

+1

Вот очень упрощенное воспроизведение: http://sqlfiddle.com/#!6/0ab56/2 –

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