2010-04-07 19 views
10

Tôi đang làm việc trên dự án ASP.Net để hiển thị thông tin trên trang web từ cơ sở dữ liệu. Tôi muốn chọn 10 mục hàng đầu từ một bảng tin nhưng bỏ qua mục đầu tiên và tôi đang gặp một số vấn đề với nó.ASP.NET SQL Server Chọn giá trị N trên cùng nhưng bỏ qua kết quả 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> 

Đây là những gì tôi có cho đến nay nhưng tôi không thể tìm thấy bất kỳ thông tin trực tuyến về làm thế nào để bỏ qua một kỷ lục

+0

Bạn có ý gì khi bỏ qua bản ghi? Bạn có đơn giản muốn trả về 9 trong 10 bản ghi hàng đầu và xử lý tất cả điều này trong truy vấn SQL không? – spong

Trả lời

8

Bạn có thể sử dụng một bộ lọc hoặc làm điều đó trong 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: Tôi đã "bỏ qua mục đầu tiên "theo nghĩa đen. Có lẽ đó không phải là ý của bạn?

+0

Yep điều này là hoàn hảo, chính xác những gì tôi đang tìm kiếm. Cảm ơn –

+0

Truy vấn này sẽ mang lại kết quả hiệu suất thảm khốc nếu tập dữ liệu của bạn ở mức hàng nghìn. Đối với 100 hồ sơ nó sẽ là một giải pháp xấu xí nhưng nó sẽ làm việc. Bất cứ lúc nào bạn đặt một cái gì đó trong mệnh đề where nó sẽ được thực hiện nhiều lần như các bản ghi phải được so sánh. Trong trường hợp này, bạn sẽ thực hiện (chọn TOP 1 id từ các thông báo thứ tự theo itemdate desc) cho mỗi bản ghi trên bảng. Chưa kể rằng sub-select này có một đơn đặt hàng trên toàn bộ bảng đắt tiền. – DidierDotNet

+0

@DidierDotNet Bạn sẽ cải thiện hiệu suất như thế nào và làm cách nào để làm cho mã này thanh lịch hơn (không xấu xí)? Lưu ý tôi xem xét xấu xí và hiệu suất để được những thứ khác nhau. Đôi khi bạn có mã trang nhã thực hiện mã kém hoặc xấu xí hoạt động tốt. Sẽ được quan tâm đến việc nghe như thế nào bạn sẽ làm cho mã này cả hai thanh lịch hơn, thực hiện tốt hơn, và đáp ứng các yêu cầu của OP. – AaronLS

9

Đối với SQL Server 2005 +, sử dụng:

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 

Nhưng có là phương tiện tốt hơn để triển khai phân trang, nếu đó thực sự là những gì bạn đang theo dõi.

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 
Các vấn đề liên quan