ORDER BY в представлении Sql Server 2008 - PullRequest
11 голосов
/ 20 августа 2009

у нас есть представление в нашей базе данных, в котором есть ORDER BY. Теперь я понимаю, что представления, как правило, не упорядочены, потому что разные люди могут использовать его для разных целей и хотят, чтобы он был по-разному упорядочен. Однако это представление используется для варианта использования VERY SPECIFIC , который требует определенного порядка. (Это командный зачет футбольной лиги.)

База данных Sql Server 2008 Express, v.10.0.1763.0 в Windows Server 2003 R2.

Вид определяется так:

CREATE VIEW season.CurrentStandingsOrdered
AS
    SELECT TOP 100 PERCENT *, season.GetRanking(TEAMID) RANKING   
    FROM season.CurrentStandings 
    ORDER BY 
        GENDER, TEAMYEAR, CODE, POINTS DESC, 
        FORFEITS, GOALS_AGAINST, GOALS_FOR DESC, 
        DIFFERENTIAL, RANKING

Возвращает:

GENDER, TEAMYEAR, CODE, TEAMID, CLUB, NAME,  
WINS, LOSSES, TIES, GOALS_FOR, GOALS_AGAINST,  
DIFFERENTIAL, POINTS, FORFEITS, RANKING

Теперь, когда я запускаю SELECT для представления, он упорядочивает результаты по GENDER, TEAMYEAR, CODE, TEAMID . Обратите внимание, что он упорядочен по TEAMID вместо POINTS , как указано в предложении order by.

Однако, если я скопирую инструкцию SQL и выполню ее точно так же, как в новом окне запроса, он упорядочится правильно, как указано в предложении ORDER BY .

Ответы [ 7 ]

19 голосов
/ 20 августа 2009

Порядок строк, возвращаемых представлением с предложением ORDER BY, никогда не гарантируется. Если вам нужен определенный порядок строк, вы должны указать, где вы выбираете в представлении.

См. Эту заметку вверху этой книги. .

19 голосов
/ 20 августа 2009

SQL Server 2005 игнорирует ТОП 100 ПРОЦЕНТОВ по проекту.

Вместо этого попробуйте TOP 2000000000.

Теперь я попытаюсь найти ссылку ... Я был на семинаре, представленном Ицаком Бен-Ганом, который упомянул об этом

Нашли немного ...

Кимберли Л. Трипп

"ТОП 100 процентов, ПОРЯДОК Считается вредным"

В данном конкретном случае оптимизатор признает, что ТОП 100 ПРОЦЕНТОВ квалифицирует все строки и не нуждается быть вычисленным на всех.

4 голосов
/ 21 сентября 2010

В SQL Server 2008 ORDER BY игнорируется в представлениях, которые используют TOP 100 PERCENT. В предыдущих версиях SQL-сервера ORDER BY был разрешен только при использовании TOP 100 PERCENT, но идеальный порядок никогда не гарантировался. Однако многие предполагали, что идеальный заказ гарантирован. Я делаю вывод, что Microsoft не хочет вводить в заблуждение программистов и администраторов баз данных, полагая, что при использовании этой техники гарантирован порядок.

Отличную сравнительную демонстрацию этой неточности можно найти здесь ...

http://blog.sqlauthority.com/2009/11/24/sql-server-interesting-observation-top-100-percent-and-order-by

Упс, я только что заметил, что на это уже ответили. Но в любом случае стоит посмотреть на сравнительную демонстрацию.

4 голосов
/ 25 апреля 2010

Просто используйте:

" Верх (99) процентов "

или

"Top (число в 1000 раз больше, чем строки данных, например, 24682468123)" оно работает! просто попробуйте.

3 голосов
/ 26 августа 2011

Microsoft исправила это. У вас есть патч вашего сервера sql

http://support.microsoft.com/kb/926292

2 голосов
/ 22 августа 2012

Я нашел альтернативное решение.

Первоначально я планировал создать столбец sort_order, который не позволял бы пользователям выполнять сложную сортировку.

Я использовал оконную функцию ROW_NUMBER. В предложении ORDER BY я указал нужный порядок сортировки по умолчанию (так же, как это было бы в ORDER BY инструкции SELECT).

Я получаю несколько положительных результатов:

  1. По умолчанию данные возвращаются в порядке сортировки по умолчанию, который я изначально планировал (это, вероятно, связано с тем, что оконной функции приходится сортировать данные до присвоения значения sort_order)

  2. Другие пользователи могут сортировать данные альтернативными способами, если они выберут

  3. Столбец sort_order предназначен для очень специфической необходимости сортировки, что упрощает пользователям сортировку данных, если какой-либо инструмент, который они используют, реорганизует набор строк.

Примечание. В моем конкретном приложении пользователи получают доступ к представлению через Excel 2010, и по умолчанию данные представляются пользователю, как я и надеялся, без дальнейшей сортировки.

Надеюсь, это поможет тем, у кого похожая проблема.

Ура, Райан

2 голосов
/ 20 августа 2009

запустите трассировку профилировщика в вашей базе данных и посмотрите, что запрос на самом деле выполняется при запросе вашего представления.

Вы также можете рассмотреть возможность использования хранимой процедуры для возврата данных из вашего представления, правильно упорядоченных для вашего конкретного случая использования.

...