2010-04-07 9 views
10

Pracuję nad projektem ASP.Net, aby wyświetlić informacje na stronie internetowej z bazy danych. Chcę wybrać 10 najlepszych rzeczy z tabeli wiadomości, ale pomijam pierwszy przedmiot i mam z tym jakiś problem.Serwer ASP.NET SQL Wybierz górne wartości N, ale pomiń wyniki 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> 

To, co mam tak daleko, ale nie mogę znaleźć żadnych informacji w Internecie o tym, jak przejść rekord

+0

Co masz na myśli, pomijając zapis? Czy chcesz po prostu zwrócić 9 najniższych 10 rekordów i obsłużyć to wszystko w zapytaniu SQL? – spong

Odpowiedz

8

Można użyć filtru lub zrobić to w 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: Wziąłem „skip pierwsza pozycja "dosłownie. Może nie o to ci chodziło?

+0

Tak, to jest idealne, dokładnie to, czego szukam. Dzięki –

+0

Ta kwerenda przyniosłaby katastrofalne wyniki wydajności, jeśli zestaw danych będzie w tysiącach. Na 100 płyt byłoby to brzydkie rozwiązanie, ale zadziałałoby. Za każdym razem, gdy umieścisz coś w klauzuli where, będzie ono wykonywane tyle razy, ile rekordów, które trzeba porównać. W tym przypadku będziesz wykonywał (wybierz TOP 1 id z porządku ogłoszeń przez itemdate desc) dla każdego rekordu na stole. Nie wspominając o tym, że ten podselek ma zamówienie na całej tabeli, co jest kosztowne. – DidierDotNet

+0

@DidierDotNet Jak można poprawić wydajność i jak uczynić ten kod bardziej eleganckim (a nie brzydkim)? Uwaga Uważam, że brzydota i wydajność są różne. Czasami masz elegancki kod, który wykonuje źle lub brzydki kod, który działa dobrze. Chciałbym usłyszeć, w jaki sposób uczynisz ten kod zarówno bardziej eleganckim, wydajniejszym, jak i spełniającym wymagania PO. – AaronLS

9

Dla SQL Server 2005+, przeznaczenie:

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 

ale nie są lepszymi sposobami implementacji stronicowania, jeśli to naprawdę jest to, o co prosisz.

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 
Powiązane problemy