ORDER BY cümlesi ile bir görünüm oluşturma
Bir ORDER BY
cümlesi ile bir görünüm oluşturmaya çalışıyorum. SQL Server 2012 SP1 üzerinde başarıyla oluşturdum, ancak SQL Server 2008 R2 üzerinde yeniden oluşturmaya çalıştığımda bu hatayı alıyorum:
Msg 102, Seviye 15, Durum 1, Prosedür TopUsers, Satır 11
Yanlış 'OFFSET' yakınındaki sözdizimi.
Görünümü oluşturmak için kod
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
=====================
Bu, diyagramın bir ekran görüntüsüdür
Kullanıcıların DisplayName
ve UserTotalMarks
değerlerini döndürmek ve bu sonucu desc olarak sıralamak istiyorum, böylece en büyük sonuca sahip kullanıcı en üstte olacak.
38
3
Bu
ORDER BY'nin neyi başardığını düşündüğünüzden emin değilim? Görünüme yasal bir şekilde
ORDER BYkoysanız bile (örneğin bir
TOPcümlesi ekleyerek), görünümden sadece seçim yaparsanız, örneğin
SELECT * FROM dbo.TopUsersTest;bir
ORDER BYcümlesi olmadan, SQL Server satırları en verimli şekilde döndürmekte serbesttir, bu da beklediğiniz sırayla eşleşmeyebilir. Bunun nedeni,
ORDER BYcümlesinin iki amaca hizmet etmeye çalıştığı için aşırı yüklenmiş olmasıdır: sonuçları sıralamak ve
TOPcümlesine hangi satırların dahil edileceğini belirlemek. Bu durumda,
TOP` her zaman kazanır (verileri taramak için seçilen dizine bağlı olarak, sıralamanızın beklendiği gibi çalıştığını gözlemleyebilirsiniz - ancak bu sadece bir tesadüftür).İstediğinizi elde etmek için,
ORDER BY
cümlesini görünümün kendi koduna değil, görünümden veri çeken sorgulara eklemeniz gerekir.Yani görünüm kodunuz sadece şöyle olmalıdır:
Sıralama ölçütü anlamsızdır, bu nedenle dahil edilmemelidir.
AdventureWorks2012 kullanarak açıklamak gerekirse, işte bir örnek:
Sonuçlar:
Ve yürütme planından
TOP
veORDER BY
ifadelerinin SQL Server tarafından kesinlikle göz ardı edildiğini ve optimize edildiğini görebilirsiniz:Hiç
TOP
operatörü ve sıralama yoktur. SQL Server bunları tamamen optimize etmiştir.Şimdi, görünümü
ORDER BY SalesID
olarak değiştirirseniz, görünümün belirttiği sıralamayı elde edersiniz, ancak yalnızca - daha önce de belirtildiği gibi - tesadüfen.Ancak, istediğiniz
ORDER BY
işlemini gerçekleştirmek için dış sorgunuzu değiştirirseniz:İstediğiniz şekilde sıralanmış sonuçlar elde edersiniz:
Ve plan hala görünümdeki
TOP
/ORDER BY
öğelerini optimize etmiştir, ancakCustomerID
öğesine göre sıralanmış sonuçları sunmak için bir sıralama eklenmiştir (küçük bir maliyet olmadan, dikkat edin):Kıssadan hisse, görünümlere ORDER BY koymayın. Bunları referans alan sorgulara ORDER BY koyun. Ve sıralama pahalıysa, bunu desteklemek için bir dizin eklemeyi / değiştirmeyi düşünebilirsiniz.
kullanarak görünümü sıralanmaya zorlamakta başarılı oldum
Ne yazık ki
SELECT TOP 100 PERCENT
kullanmak burada sorunu nedeniyle çalışmıyor.Hata şu:
FROM (SELECT empno,name FROM table1 where location = 'A' ORDER BY emp_no)
Ve çözüm:
FROM (SELECT empno,name FROM table1 where location = 'A') ORDER BY emp_no