2009-08-20 2 views
11

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

База данных 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 , CODE, TEAMID. Обратите внимание, что он заказывает TEAMID вместо POINTS как указано в заказе by.

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

ответ

19

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

См. Это примечание в верхней части this Book On-Line.

+0

Это раздражает! Я могу видеть/понимать, не гарантируя его в VIEW, вроде ... но он должен хотя бы работать в функции, ориентированной на таблицу. GRRR. Спасибо за ответ в любом случае. :) – eidylon

19

SQL Server 2005 игнорирует TOP 100 PERCENT по дизайну.

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

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

Найдено некоторые ...

Kimberly L. Tripp

"TOP 100 Percent ORDER BY Considered Harmful"

В данном конкретном случае, оптимизатор признает, что ТОП 100 процентов квалифицирует все строки и не требуется .

+0

Мне интересно исправление SQL Server Я просто наткнулся: http://support.microsoft.com/kb/926292: если я читаю это правильно, то исправление «исправляет» поведение для сортировки? –

+0

@MitchWheat: да, выглядит знакомым.Я думаю, это означает, что внутренний TOP..ORDER BY fubars нарушает ORDER BY – gbn

+0

. Я не уверен, что это так. Кажется, что применение исправления гарантирует, что ORDER BY в представлениях всегда работает (что явно противоречит статье MSDN (и, возможно, здравому смыслу!)) –

2

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

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

+0

Да, я действительно искал что-то прямо запрашиваемое, хотя ... view, table-value функция, которой нет sproc. – eidylon

4

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

"Top (99) Процент"

или

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

4

В 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

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

2

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

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

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

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

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

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

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

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

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

Приветствия, Райана

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