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.

żółta krew
źródło
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.

nvogel
źródło
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)

gbn
źródło
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
SqlACID
źródło
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