Порядок в представлении Sql Server 2008

у нас есть представление в нашей базе данных, которое имеет порядок в нем. Теперь я понимаю, что взгляды обычно не упорядочиваются, потому что разные люди могут использовать его для разных вещей и хотят, чтобы он был по-разному упорядочен. Однако это представление используется для ОЧЕНЬ СПЕЦИФИЧЕСКИЙ use-case, который требует определенного порядка. (Это командный зачет для футбольной Лиги.)

база данных 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

теперь, когда я запустить выберите против представления, он заказывает результаты по ПОЛ, TEAMYEAR, КОД, TEAMID. Обратите внимание, что он заказывает по TEAMID вместо точки как указывает предложение order by.

однако, если я копирую оператор SQL и запускаю его точно так же, как в новом окне запроса, он упорядочивает правильно, как указано ПРИКАЗОМ пункт.

7 ответов


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

см. это примечание в верхней части эта книга он-лайн запись.


SQL Server 2005 игнорирует 100% лучших по дизайну.

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

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

нашел...

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

"верхний 100-процентный заказ считается вредным"

в этом конкретном случае оптимизатор признает, что топ-100 процентов квалифицирует все строки и не требует быть вычисленным вообще.


просто использовать :

"Верхний (99) Процент "

или

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


в SQL server 2008 порядок игнорируется в представлениях, использующих 100 процентов. В предыдущих версиях SQL server порядок был разрешен только в том случае, если использовался верхний 100%, но идеальный порядок никогда не гарантировался. Однако многие полагали, что идеальный порядок гарантирован. Я предполагаю, что Microsoft не хочет вводить в заблуждение программистов и DBAs, полагая, что существует гарантированный порядок с использованием этой техники.

превосходная сравнительная демонстрация этой неточности, можно найти здесь...

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

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


Microsoft исправила это. У вас есть исправление sql server

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


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

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


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

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

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

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

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

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

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

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

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

Ура, Райан!--1-->