2010-04-07 13 views
10

Sto lavorando a un progetto ASP.Net per visualizzare le informazioni su un sito Web da un database. Voglio selezionare i primi 10 elementi da una tabella di notizie, ma salta il primo elemento e sto avendo qualche problema con esso.ASP.NET SQL Server Selezionare i valori N superiori ma saltare i risultati M

<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> 

Questo è ciò che ho finora, ma non riesco a trovare alcuna info on-line su come saltare un record di

+0

Cosa intendi per saltare il record? Vuoi semplicemente restituire il 9 inferiore dei 10 record più in alto e gestire tutto ciò in una query SQL? – spong

risposta

8

È possibile utilizzare un filtro o farlo in SQL:

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  

Edit: ho preso "Salta la prima voce " letteralmente. Forse non è quello che intendevi?

+0

Sì, questo è perfetto, esattamente quello che sto cercando. Grazie –

+0

Questa query produrrebbe risultati di prestazioni catastrofici se il tuo set di dati dovesse arrivare a migliaia. Per 100 record sarebbe una brutta soluzione ma funzionerebbe. Ogni volta che inserisci qualcosa nella clausola where, verrà eseguito tutte le volte che i record devono essere confrontati. In questo caso dovresti eseguire (selezionare TOP 1 id dall'ordine degli annunci per itemdate desc) per ogni record sul tavolo. Per non parlare del fatto che questa sottoselezione ha un ordine sull'intera tabella che è costoso. – DidierDotNet

+0

@DidierDotNet Come miglioreresti le prestazioni e come renderebbe questo codice più elegante (non brutto)? Nota, considero la brutta e la prestazione essere a cose diverse. A volte hai un codice elegante che esegue codice scadente o brutto che funziona bene. Sarebbe interessato a sentire come si renderebbe questo codice sia più elegante, più performante, sia conforme ai requisiti dell'OP. – AaronLS

9

Per SQL Server 2005 +, uso:

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 

Ma c'è sono i mezzi migliori per implementare l'impaginazione, se questo è davvero ciò che cerchi.

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 
Problemi correlati