2012-06-11 17 views
6

estoy usando iBatis y SQLServer,consulta SQL para paginación rejilla asp.net

Cuál es la mejor manera para el uso de desplazamiento y un límite para consultas pagging?

Quizás agregue la columna ROW_NUMBER() OVER (ORDER BY Id) AS RowNum, pero esto solo evitará el acceso a datos para consultas simples. Hay algunos casos que utilizo la unión de selects. ¿Cómo optimizar estas consultas?

Respuesta

1

No sé nada de ibatis, pero supongo que se puede hacer esto en SQL.

Si le entiendo correctamente, quiere obtener los resultados de una declaración seleccionada o unión de unas pocas declaraciones seleccionadas.

Lo haría de la siguiente manera. Esto podría ser un procedimiento almacenado, por ejemplo, y probablemente debería haber alguna comprobación de cordura allí donde los valores de compensación y límite sean mayores que 0. Si terminas haciendo algo como esto, asegúrate de reemplazar * con tu columna nombres también!

Aquí se muestra un ejemplo con un sindicato:

DECLARE @offset INT; 
DECLARE @limit INT; 

WITH cte 
    AS (SELECT t.*, 
       Row_number() OVER (ORDER BY Id) AS RowNum 
     FROM (SELECT * 
       FROM Table1 
       UNION 
       SELECT * 
       FROM Table2) t) 
SELECT * 
FROM cte 
WHERE RowNum BETWEEN @offset AND @offset + @limit 

Esencialmente lo que he hecho se deriva una nueva tabla a partir de la unión de dos consultas, como usted ha dicho que podría suceder en su caso. A continuación, agrego una columna con el número de fila al resultado de eso en un CTE, luego solo selecciono las filas especificadas en @Offset y @limit + @offset para recuperar solo las filas que solicitó.

E.g. Configuración @offset = 50 y @limit = 50, se obtendría volver resultados 50-100 (según lo ordenado por los criterios especificados en la cláusula sobre Row_number.

(espero que este era el tipo de cosas que estaba buscando!)

Editar: Esto solo funcionará en SQL Server 2005 en adelante. No ha mencionado qué versión está usando!

+0

¿Cómo puedo obtener el número total de filas? – Victor

+0

Desde el CTE, seleccione 'count (*) ', o' Max (RowNum) ... ' – Bridge

Cuestiones relacionadas