2010-11-29 14 views
8

Por ejemplo, tengo una tabla que contiene 10'000 filas. Quiero seleccionar las 100 mejores filas después de la fila 500 superior. ¿Cómo puedo hacer esto de la manera más eficiente?Cómo seleccionar los datos top x datos después de las filas y de SQL Server

de consulta necesaria para SQL Server 2008


Por ejemplo tengo esta consulta ya, pero me pregunto ¿hay alguna solución más eficaz

SELECT TOP 100 xx 
FROM nn 
WHERE cc NOT IN 
    (SELECT TOP 500 cc 
     FROM nn ORDER BY cc ASC) 
+0

qué versión de MS SQL Server? – hunter

+0

versión ms sql 2008 – MonsterMMORPG

+0

¿Quiere decir que quiere seleccionar las filas 500-600? ¿O quieres que un conjunto de resultados devuelva las 500 filas superiores y luego las 100 primeras filas concatenas? –

Respuesta

14

Tutorial 25: Efficiently Paging Through Large Amounts of Data

with cte as (
SELECT ..., 
    ROW_NUMBER() OVER (ORDER BY ...) as rn 
FROM ...) 
SELECT ... FROM cte 
WHERE rn BETWEEN 500 and 600; 
+0

¿podemos decir que esta es la forma más eficiente? – MonsterMMORPG

+1

No. Todavía debe, incluso en el mejor de los casos, escanear 500 filas para contarlas, de modo que sepa cuándo comenzar. En el peor de los casos, necesita escanear todas las filas, ordenarlas y luego contar 500 filas ordenadas para llegar al punto de partida. Las cosas empeoran si solicita la fila 9500 a 10000, y luego mucho peor para las filas 999500 a 1000000. La forma más eficiente es el conjunto de claves: 'SELECCIONAR TOP (500) ... DESDE ... tecla WHERE> @ lastPageLastKey' , pero esto requiere una lógica sofisticada en el cliente (hacer un seguimiento de las claves) y no permite órdenes de columnas arbitrarias. –

+0

veo. pero es bastante imposible para mí, ya que hay funciones de filtrado. – MonsterMMORPG

2

Selección TOP 500, a continuación, concatenando el TOP 100 al conjunto de resultados.

Normalmente, para que valga la pena hacerlo, debe tener algunos criterios sobre los cuales basar para lo que necesita 500 registros, y solo 100 para otra condición. Supongo que estas condiciones son condición1 para TOP 500 y condición2 para las TOP 100 que desee. Debido a que las condiciones son diferentes, esa es la razón por qué los registros podrían no ser los mismos en base a TOP 100.

select TOP 500 * 
    from MyTable 
    where -- condition1 -- Retrieving the first 500 rows meeting condition1 
union 
    select TOP 100 * 
     from MyTable 
     where -- condition2 -- Retrieving the first 100 rows meeting condition2 
-- The complete result set of the two queries will be combined (UNIONed) into only one result set. 

editar # 1

esto no es lo que quise decir. Quiero seleccionar las 100 mejores filas que vienen después de la 500ª fila superior. para seleccionar filas 501-600

Después de su comentario, entiendo mejor lo que quiere lograr. Pruebe esto:

WITH Results AS (
    select TOP 600 f.*, ROW_NUMBER() OVER (ORDER BY f.[type]) as RowNumber 
     from MyTable f 
) select * 
    from Results 
    where RowNumber between 501 and 600 

¿Le sirve de ayuda?

+0

esto no es lo que quise decir. Quiero seleccionar las 100 mejores filas que vienen después de la 500ª fila superior. por lo que seleccionar las filas 501-600 – MonsterMMORPG

+0

por las que quiero es bastante simple. simplemente paginación. por ejemplo, tiene 1000 registros. pero por página muestra el usuario 100. No quiero seleccionar los 1000 resultados a la vez. – MonsterMMORPG

+0

Luego tendrá que seleccionar un conjunto de resultados más grande y filtrarlo por 'ROW_NUMBER' –

3
SELECT 
    col1, 
    col2 
FROM (
    SELECT ROW_NUMBER() OVER (
     ORDER BY [t0].someColumn) as ROW_NUMBER, 
    col1, 
    col2 
    FROM [dbo].[someTable] AS [t0] 
    ) AS [t1] 
WHERE [t1].[ROW_NUMBER] BETWEEN 501 and 600 
ORDER BY [t1].[ROW_NUMBER] 
+2

downvoted para la instrucción select dentro de la instrucción select. La instrucción de selección interna es extremadamente ineficaz. TI realiza una búsqueda de RBAR, http://www.simple-talk.com/sql/t-sql-programming/rbar--row-by-agonizing-row/ Si se puede evitarid (la mayoría de las veces puede) nunca selecciones interiores –

+0

+1 Me pegó. –

+0

Me plantearía la pregunta: ¿Por qué? A veces es inevitable. –

9
Select T0P 600 * 
from my table 
where --whatever condition you want 
except 
select top 500 * 
from mytable 
where --whatever condition you want 
+0

+1 ¡Agradable! No sabía acerca de la declaración 'EXCEPT'. –

+0

Esta parece ser la mejor respuesta, excepto que tenemos que dar la misma condición donde dos veces. – Thunder

Cuestiones relacionadas