2010-04-07 13 views
10

Estoy trabajando en un proyecto ASP.Net para mostrar información en un sitio web desde una base de datos. Quiero seleccionar los 10 elementos principales de una tabla de noticias, pero omita el primer elemento y tengo algún problema con él.ASP.NET SQL Server Seleccione los valores N superiores, pero omita los resultados de 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> 

Esto es lo que tengo hasta ahora, pero no puedo encontrar ninguna información en línea acerca de cómo saltar un registro

+0

¿Qué quiere decir con skip the record? ¿Simplemente desea devolver los 9 últimos registros de los 10 principales y manejar todo esto en una consulta SQL? – spong

Respuesta

8

Se puede usar un filtro o hacerlo en el 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  

Editar: Tomé "salto el primer artículo "literalmente. Tal vez eso no es lo que querías decir?

+0

Sí, esto es perfecto, exactamente lo que estoy buscando. Gracias –

+0

Esta consulta arrojaría resultados de rendimiento catastróficos si su conjunto de datos llega a miles. Para 100 registros sería una solución fea pero funcionaría. Cada vez que coloque algo en la cláusula where, se ejecutará tantas veces como registros que deban compararse. En este caso, ejecutaría (seleccione ID de TOP 1 de la orden de avisos por desc. De fecha de artículo) para cada registro en la tabla. Sin mencionar que esta sub-selección tiene un orden en toda la mesa que es caro. – DidierDotNet

+0

@DidierDotNet ¿Cómo mejoraría el rendimiento y cómo haría que este código fuera más elegante (no feo)? Tenga en cuenta que considero que la fealdad y el rendimiento son diferentes. A veces tiene un código elegante que realiza un código pobre o feo que funciona bien. Estaría interesado en saber cómo haría que este código fuera más elegante, de mejor rendimiento y cumpliera con los requisitos del OP. – AaronLS

9

Para SQL Server 2005 +, el 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 

Pero hay son mejores medios para implementar la paginación, si eso es lo que realmente buscas.

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