2009-08-20 11 views
11

Mamy widok w naszej bazie danych, która zawiera ORDER BY. Teraz zdaję sobie sprawę, że poglądy generalnie nie porządkują, ponieważ różni ludzie mogą używać go do różnych rzeczy i chcą, żeby było inaczej uporządkowane. Ten widok jest jednak używany w przypadku użycia określonego przypadku, który wymaga określonej kolejności. (Jest to ranking drużynowy w lidze piłkarskiej.)ORDER BY w Sql Server 2008 view

Baza danych to Sql Server 2008 Express, wersja 10.0.1763.0 w systemie Windows Server 2003 R2.

Widok jest zdefiniowany jako takie:

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 

Zwraca:

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

Teraz, kiedy uruchomić SELECT przeciwko widzenia, porządkuje wyniki według płeć, TEAMYEAR , KOD, TEAMID. Zauważ, że jest zamawiane przez TEAMID zamiast PUNKTY zgodnie z klauzulą ​​order by.

Jeśli jednak skopiuję instrukcję SQL i uruchomię ją dokładnie tak, jak w nowym oknie zapytania, zamówienie zostanie wykonane zgodnie z klauzulą ​​ORDER BY.

Odpowiedz

19

Kolejność wierszy zwróconych przez widok z klauzulą ​​ORDER BY nigdy nie jest gwarantowana. Jeśli potrzebujesz określonej kolejności wierszy, musisz określić, gdzie wybierzesz z widoku.

Zobacz notatkę u góry wpisu this Book On-Line.

+0

To denerwujące! W pewnym sensie widzę/rozumiem, że nie gwarantuję tego w WIDOKU, ale ... powinno to przynajmniej działać w funkcji wycenianej w tabeli. GRRR. Dzięki za odpowiedź. :) – eidylon

19

SQL Server 2005 ignoruje TOP 100 PERCENT według projektu.

Zamiast tego wypróbuj TOP 2000000000.

Teraz będę próbować i znaleźć odniesienie ... Byłem na seminarium prezentowane przez Itzak Ben-Gan, którzy wspomnieli, że

Znaleziono niektóre ...

Kimberly L. Tripp

"TOP 100 Percent ORDER BY Considered Harmful"

W tym konkretnym przypadku, optymalizator uznaje TOP 100 PERCENT kwalifikuje wszystkie wiersze i w ogóle nie musi być obliczana.

+0

jestem ciekaw tego SQL Server poprawki Właśnie natknęliśmy: http://support.microsoft.com/kb/926292: jeśli ja czytam to poprawnie, wtedy poprawka "naprawia" zachowanie do sortowania? –

+0

@MitchWheat: tak, wygląda znajomo.Myślę, że oznacza to, że wewnętrzna GÓRA ... ZNAJDUJE SIĘ przez fubars z zewnętrznej kolejności przez – gbn

+0

Nie jestem pewien, czy to robi. Wydaje się, że zastosowanie tej poprawki zagwarantuje, że ORDER BY w widokach zawsze działa (co oczywiście jest sprzeczne z artykułem MSDN (i prawdopodobnie dobrze!). –

2

bieg śladu profiler na swojej bazie danych i zobaczyć kwerendy, która jest faktycznie jest prowadzony podczas przeszukiwania widoku.

Można również rozważyć użycie procedury przechowywanej w celu zwrócenia danych z widoku, uporządkowanych poprawnie dla konkretnego przypadku użycia.

+0

Yah, naprawdę szukałem czegoś bezpośrednio możliwego do sprawdzenia ... widok, funkcja o wartości tabelarycznej, której sproc nie jest. – eidylon

4

Wystarczy użyć:

"Top (99) Procent"

lub

"Top (liczba 1000S razy więcej niż wierszy danych, takich jak 24682468123)" to działa! po prostu spróbuj.

4

W SQL Server 2008 ORDER BY jest ignorowany w widokach używających TOP 100 PERCENT. W poprzednich wersjach serwera SQL ORDER BY był dozwolony tylko w przypadku użycia TOP 100 PERCENT, ale nigdy nie gwarantowano doskonałego zamówienia. Jednak wielu założyło, że zagwarantowano doskonały porządek. Wnioskuję, że Microsoft nie chce wprowadzać w błąd programistów i administratorów baz danych, ponieważ wierzy, że przy użyciu tej techniki istnieje gwarantowany porządek.

doskonałym przykładem porównawczym tej niedokładności, można znaleźć tutaj ...

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

ups, Właśnie zauważyłem, że było to już odpowiedział. Ale sprawdzanie porównawczej demonstracji i tak jest warte zachodu.

2

znalazłem rozwiązanie alternatywne.

Mój początkowy plan polegał na utworzeniu kolumny "sort_order", która uniemożliwiałaby użytkownikom sortowanie złożone.

Użyłem funkcji okienkowej ROW_NUMBER. W klauzuli ORDER BY podałem domyślną kolejność sortowania, która była mi potrzebna (tak jak w ORDER BY instrukcji SELECT).

mam kilka pozytywnych rezultatów:

  1. Domyślnie dane są coraz zwracane w kolejności domyślnej sortowania pierwotnie zamierzonego (jest to prawdopodobnie ze względu na funkcję okienkiem konieczności sortowania danych przed przypisaniem wartość porządek_sortowania)

  2. Inni użytkownicy mogą posortować dane w alternatywnych sposobów, jeżeli zdecydują się

  3. kolumna porządek_sortowania jest tam na bardzo konkretnej potrzeby sortowania, ułatwiając fo r użytkowników do sortowania danych, niezależnie od używanego narzędzia, zmienia kolejność zestawów wierszy.

Uwaga: W moim konkretnej aplikacji, użytkownicy mają dostęp do widoku za pomocą programu Excel 2010, a domyślnie dane są prezentowane użytkownikowi jak miałem nadzieję bez dalszego sortowania potrzebne.

Mam nadzieję, że pomoże to osobom mającym podobny problem.

Cheers, Ryan