Jakie są alternatywy dla klauzuli ORDER BY w widoku?


12

To pytanie musiało być na tej stronie :)

ORDER BY jest zabronione w widoku, jak zrozumiałem, ze względu na możliwość wielokrotnego zamówienia przez podczas korzystania z tego widoku.

Wiem, że istnieją na przykład sposoby obejścia tego ograniczenia, TOP 99.999999 PERCENTale chciałbym wiedzieć, jaka jest najlepsza praktyka, a nie jak ją zhakować.

Tak więc, jeśli chcę tworzyć widoki w mojej bazie danych do użytku osobistego, co oznacza, że ​​chcę połączyć się z bazą danych i po prostu zobaczyć dane naprawione i posortowane, jak mam to zrobić, jeśli nie mogę zamówić widoku?

Obecnie w mojej SQL Server DB mam widoki z TOPwłamaniem i używam ich bardzo często, ale wydaje się to złe.


1
dlaczego nie TOP 100%?
garik

@garik - ponieważ nadal nie gwarantuje zamówienia, jeśli poprawnie rozumiem link gbn. Jest to po prostu bardziej zwięzła, błędna odpowiedź
Jack mówi, spróbuj wypróbować topanswers.xyz

1
@Jack Douglas to nie była odpowiedź, to był komentarz do top 99,999 ...
garik

@garik - w SQL Server 2008 TOP 100 PROCENT jest ignorowany i działa tylko 99. Myślę, że zostało to naprawione, ale moja wersja nie została zaktualizowana.
yellowblood

1
To nie jest ograniczenie techniczne. To jest z założenia. Dlatego każde obejście jest jak włamanie. Narzuć swoje zamówienie w zapytaniach przeciwko widokom. Kolejność ma zastosowanie do zestawu wyników (wynik zapytania e.ge), a nie do zbioru danych (np. Widok lub tabela).
Nick Chammas,

Odpowiedzi:


2

Nie ma czegoś takiego jak „uporządkowany” widok, ponieważ widok powinien być zbiorem wierszy. Użyj procedury składowanej, jeśli chcesz mieć stałe zamówienie.


To odpowiedź wyjaśnia, dlaczego nie można narzucić kolejności w definicji widoku. Zestaw z definicji nie ma zamówienia. Jednak w połączeniu TOPz ORDER BYdefiniujesz nowy zestaw, ponieważ kolejność wpływa na to, które wiersze są „górne”; dlatego TOPumożliwia korzystanie ORDER BYz definicji widoku.
Nick Chammas,

9

Tylko najbardziej zewnętrzny ORDER BY gwarantuje zamówienie

  • Wszelkie pośrednie lub wewnętrzne ORDER BY są ignorowane.
    Obejmuje to ORDER BY w widoku
  • W żadnej tabeli nie ma dorozumianego porządku
  • Nie ma dorozumianego porządku z żadnego indeksu (klastrowanego lub nie) w tej tabeli

Spinki do mankietów

ORDER BY gwarantuje posortowany wynik tylko dla najbardziej zewnętrznej instrukcji SELECT zapytania. Rozważmy na przykład następującą definicję widoku: (i następujący przykład pasujący do tego pytania)


Dzięki za wyjaśnienie, ale nie takiej odpowiedzi szukałem :) Próbuję zobaczyć, jakie są alternatywy dla bardzo wygodnego ZAMÓWIENIA w widoku.
yellowblood

3

Dodaj ORDER BY do wyjścia widoku tj

  SELECT whatever FROM MYVIEW ORDER BY whatever

1
Nie istnieje dorozumiana kolejność według indeksu klastrowego. -1.
gbn

@SqlACID - dobra edycja, +1 zamiast -1 :)
Jack mówi: spróbuj topanswers.xyz

Oznacza to, że musisz przepisać zamówienie według klauzuli za każdym razem, gdy przeszukujesz widok, a tego właśnie staramy się unikać, gdy korzystamy z zamówienia wewnątrz widoku.
yellowblood

jak powiedział dportas, przechowywane opakowanie proc wokół zapytania działałoby, ale prawdopodobnie nie to, czego szukasz.
SqlACID

Właściwie próbowałem procedury składowanej, ale nie było wystarczająco łatwe i szybkie, aby zapytać lub manipulować. Meh
yellowblood
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.