Lebih
Membuat view dengan klausa ORDER BY
Saya mencoba membuat tampilan dengan klausa ORDER BY
. Saya telah berhasil membuatnya di SQL Server 2012 SP1, tetapi ketika saya mencoba membuatnya kembali di SQL Server 2008 R2, saya mendapatkan kesalahan ini:
Msg 102, Level 15, State 1, Prosedur TopUsers, Baris 11
Salah sintaksis dekat ' OFFSET'.
Kode untuk membuat tampilan adalah
CREATE View [dbo].[TopUsersTest]
as
select
u.[DisplayName] , sum(a.AnswerMark) as Marks
From Users_Questions us inner join [dbo].[Users] u
on u.[UserID] = us.[UserID]
inner join [dbo].[Answers] a
on a.[AnswerID] = us.[AnswerID]
group by [DisplayName]
order by Marks desc
OFFSET 0 ROWS
=====================
Ini adalah cuplikan layar dari diagram
Saya ingin mengembalikan pengguna DisplayName
dan UserTotalMarks
dan mengurutkan hasil ini, sehingga pengguna dengan hasil terbesar berada di atas.
38
3
Saya tidak yakin apa yang anda pikirkan tentang apa yang dicapai oleh
ORDER BY
ini? Bahkan jika Anda melakukan menempatkanORDER BY
dalam tampilan dengan cara yang legal (misalnya dengan menambahkan klausaTOP
), jika Anda hanya memilih dari tampilan, misalnyaSELECT * FROM dbo.TopUsersTest;
tanpa klausaORDER BY
, SQL Server bebas mengembalikan baris dengan cara yang paling efisien, yang tidak akan selalu sesuai dengan urutan yang Anda harapkan. Ini karenaORDER BY
kelebihan beban, karena mencoba untuk melayani dua tujuan: untuk mengurutkan hasil dan untuk menentukan baris mana yang akan dimasukkan dalamTOP
. Dalam hal ini,TOP
selalu menang (meskipun tergantung pada indeks yang dipilih untuk memindai data, Anda mungkin mengamati bahwa urutan Anda bekerja seperti yang diharapkan - tetapi ini hanya kebetulan).Untuk mencapai apa yang anda inginkan, anda perlu menambahkan klausa
ORDER BY
anda ke kueri yang menarik data dari view, bukan ke kode view itu sendiri.Jadi kode view anda seharusnya hanya:
ORDER BY
tidak ada artinya sehingga tidak perlu disertakan.Untuk mengilustrasikan, dengan menggunakan AdventureWorks2012, berikut ini adalah contohnya:
Hasil:
Dan Anda dapat melihat dari rencana eksekusi bahwa
TOP
danORDER BY
telah benar-benar diabaikan dan dioptimalkan oleh SQL Server:Tidak ada operator
TOP
sama sekali, dan tidak ada pengurutan. SQL Server telah mengoptimalkannya sepenuhnya.Sekarang, jika Anda mengubah tampilan menjadi
ORDER BY SalesID
, Anda akan mendapatkan urutan yang dinyatakan oleh tampilan, tetapi hanya - seperti yang disebutkan sebelumnya - secara kebetulan.Tetapi jika Anda mengubah kueri luar Anda untuk melakukan
ORDER BY
yang Anda inginkan:Anda mendapatkan hasil yang diurutkan seperti yang Anda inginkan:
Dan rencana tersebut masih mengoptimalkan
TOP
/ORDER BY
dalam tampilan, tetapi pengurutan ditambahkan (dengan biaya yang tidak sedikit, ingatlah Anda) untuk menyajikan hasil yang diurutkan berdasarkanCustomerID
:Jadi, moral dari cerita ini, jangan menaruh ORDER BY dalam view. Letakkan ORDER BY dalam query yang mereferensikannya. Dan jika pengurutan itu mahal, Anda mungkin mempertimbangkan untuk menambahkan/mengubah indeks untuk mendukungnya.
Saya telah berhasil memaksa tampilan untuk dipesan menggunakan
Sayangnya menggunakan
SELECT TOP 100 PERSEN
tidak bekerja karena masalah di sini.Kesalahan adalah:
FROM (SELECT empno,nama FROM table1 where lokasi = 'A' ORDER BY emp_no)
Dan solusinya adalah :
DARI (SELECT empno,nama FROM table1 where lokasi = 'A') ORDER BY emp_no