2010-04-07 9 views
10

Bir veritabanından bir veritabanından bilgi görüntülemek için bir ASP.Net projesi üzerinde çalışıyorum. Bir haber tablosundan ilk 10 öğeyi seçmek istiyorum ancak ilk Öğeyi atla ve onunla ilgili bir sorun yaşıyorum. ASP.NET SQL Server Üst N değerleri seçin, ancak M sonuçlarını atlayın

<asp:SqlDataSource ID="SqlDataSource1" 
        runat="server" ProviderName="System.Data.SqlClient" 
        ConnectionString="<%$ ConnectionStrings:ClubSiteDB %>" 
        SelectCommand="SELECT top 5 [id], 
               [itemdate], 
               [title], 
               [description], 
               [photo] 
            FROM [Announcements] order by itemdate desc"> 
</asp:SqlDataSource> 

Bu

şimdiye kadar var ama SQL Server 2005+, kullanım için bir kayıt

+0

Kayıt atlayarak ne demek istiyorsunuz? En iyi 10 kaydın altını 9 döndürmek ve tüm bunları bir SQL sorgusunda kullanmak ister misiniz? – spong

cevap

8

:

SELECT top 10 
     [id], 
     [itemdate], 
     [title], 
     [description], 
     [photo] 
    FROM [Announcements] 
    WHERE id <> (select TOP 1 id from announcements order by itemdate desc) 
    order by itemdate desc  

Düzenleme: "aldı ilk Öğe atlamak " harfi harfine. Belki de demek istediğin bu değil?

+0

Evet, bu tam olarak ne arıyorum, mükemmel. Teşekkürler –

+0

Bu sorgu, veri kümenizin binlerce olmasına rağmen, felaket performansıyla sonuçlanır. 100 kayıt için çirkin bir çözüm olurdu ama işe yarayacaktı. Nerede bir yere koyduktan sonra, bir çok kez karşılaştırılması gereken kayıtlar olarak yürütülür. Bu durumda, tablodaki her bir kayıt için yürütülür (itemdate desc tarafından yapılan duyurulardan TOP 1 id öğesini seçin). Bu alt-seçimin, pahalı olan tüm tabloya göre bir sipariş verdiğinden bahsetmiyoruz. – DidierDotNet

+0

@DidierDotNet Performansı nasıl geliştirirsiniz ve bu kodu nasıl daha zarif (çirkin değil) yaparsınız? Not Çirkinlik ve performansın farklı şeyler olduğunu düşünüyorum. Bazen zarif kodunuz var, iyi performans gösteren kötü ya da çirkin kod gerçekleştirir. Bu kodu nasıl daha zarif, daha iyi performans göstereceğini ve OP'nin gereksinimlerini karşıladığını duymak ilginizi çeker. – AaronLS

9

atlamak konusunda çevrimiçi herhangi bir bilgi bulamıyorum şudur:

SELECT x.* 
    FROM (SELECT t.id, 
       t.itemdate, 
       t.title, 
       t.description, 
       t.photo, 
       ROW_NUMBER() OVER (ORDER BY t.itemdate) AS rank 
      FROM ANNOUNCEMENTS t) x 
WHERE x.rank BETWEEN a AND b 

Ama pagination'ı uygulamak için daha iyi araçlar, eğer peşinde olduğun şey buysa.

0
DECLARE @topid int 
select @topid = max(id) from announcements group by itemdate, id 

SELECT top 10 [id], [itemdate], [title], [description], [photo]  
FROM [Announcements] A 
WHERE A.id <> @topid 
order by itemdate desc