2011-04-11 7 views
19

No parece estar teniendo mucha suerte en este sitio, aún para siempre el optimista, lo seguiré intentando. Tengo dos tablas, Revistas y ArticleCategories que se unen utilizando la siguiente consulta:T-SQL Omitir Tomar Procedimiento almacenado

SELECT Journals.JournalId, 
     Journals.Year, 
     Journals.Title, 
     ArticleCategories.ItemText 
FROM Journals 
     LEFT OUTER JOIN ArticleCategories 
     ON Journals.ArticleCategoryId = ArticleCategories.ArticleCategoryId 

Puede alguien decirme cómo puedo volver a escribir esto lo hacen en un salto, Take consulta. En otras palabras, quiero omitir los primeros n registros y luego tomar el siguiente n. Creo que ROW_NUMBER está involucrado en algún lado pero no puedo encontrar la manera de usarlo en este caso.

Sospecho que la razón por la que no tengo mucha suerte es porque me resulta difícil explicar lo que estoy tratando de hacer. Si mi pregunta no está clara, no dude en decirme dónde me estoy equivocando y con gusto intentaré de nuevo. Quizás también debería mencionar que estoy tratando de poner esto en un procedimiento almacenado. Muchas gracias. Muchas gracias,

+0

'' n primeros registros - según lo ordenado por qué? –

+0

¡Buen punto! Olvidé mencionar que debe ser ordenado por algo. ¿Podría volver a imponerme y preguntar cómo incluir ORDER BY Journals.Year? Muchas gracias Martin. –

+0

Disculpa por mi comentario anterior Martin. Si hubiera sido más cuidadoso, habría notado que había incluido una declaración ORDER BY. Gracias otra vez. –

Respuesta

55

Para 2005/2008/2008 R2

;WITH cte AS 
(
    SELECT Journals.JournalId, 
      Journals.Year, 
      Journals.Title, 
      ArticleCategories.ItemText, 
      ROW_NUMBER() OVER 
        (ORDER BY Journals.JournalId,ArticleCategories.ItemText) AS RN 
    FROM Journals LEFT OUTER JOIN 
      ArticleCategories 
      ON Journals.ArticleCategoryId = ArticleCategories.ArticleCategoryId 
) 
    SELECT JournalId, 
      Year, 
      Title, 
      ItemText 
FROM cte 
WHERE RN BETWEEN 11 AND 20 

Para 2012 este es más simple

SELECT Journals.JournalId, 
     Journals.Year, 
     Journals.Title, 
     ArticleCategories.ItemText 
FROM Journals 
     LEFT OUTER JOIN ArticleCategories 
     ON Journals.ArticleCategoryId = ArticleCategories.ArticleCategoryId 
ORDER BY Journals.JournalId, 
      ArticleCategories.ItemText 
OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY 
+1

¡Excepcional! Gracias Martin, funcionó perfectamente. Muy agradecida. –

2

Además de respuesta correcta de @ Martin Smith - cuando se utiliza un GROUP BY, puede no use OFFSET-FETCH sin un ORDER BY:

GROUP BY [cols] 

ORDER BY [col] ASC|DESC 

OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY 

A continuación se presenta "syntaxt incorrecta cerca de 'OFFSET'":

GROUP BY [cols] 

--ORDER BY [col] ASC|DESC 

OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY 
Cuestiones relacionadas