Порядок в представлении 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, полагая, что существует гарантированный порядок с использованием этой техники.
превосходная сравнительная демонстрация этой неточности, можно найти здесь...
Ой, я только что заметил, что на это уже ответили. Но все равно стоит взглянуть на сравнительную демонстрацию.
запустите трассировку профилировщика в базе данных и посмотрите запрос на самом деле выполняется при запросе представления.
вы также можете рассмотреть возможность использования хранимой процедуры для возврата данных из вашего представления, упорядоченных правильно для вашего конкретного случая использования.
Я нашел альтернативное решение.
мой первоначальный план состоял в том, чтобы создать столбец "sort_order", который помешал бы пользователям выполнять сложную сортировку.
Я использовал оконную функцию ROW_NUMBER. В предложении ORDER BY я указал порядок сортировки по умолчанию, который мне нужен (так же, как это было бы в порядке инструкции SELECT).
Я получаю несколько положительных результатов:
по умолчанию, данные все возвращенный в порядке сортировки по умолчанию, который я изначально предполагал (это, вероятно, связано с оконной функцией, которая должна сортировать данные до назначения значения sort_order)
другие пользователи могут сортировать данные альтернативными способами, если они решат
столбец sort_order существует для очень конкретной потребности в сортировке, что облегчает пользователям сортировку данных, если какой-либо инструмент, который они используют, переставляет набор строк.
Примечание:В моем конкретном приложении пользователи получают доступ к представлению через Excel 2010, и по умолчанию данные представлены пользователю, как я надеялся, без дополнительной сортировки.
надеюсь, это поможет тем, у кого аналогичная проблема.
Ура, Райан!--1-->