Процедура прокрутки T-SQL

Кажется, мне не очень повезло на этом сайте, но навсегда оптимист, я буду продолжать пытаться. У меня есть две таблицы, Журналы и ArticleCategories, которые объединены с помощью этого запроса:

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

Может ли кто-нибудь сказать мне, как я могу переписать это, сделать это в Пропустить, принять запрос. Другими словами, я хочу, чтобы он пропускал первые n записей, а затем взял следующий n. Я думаю, что ROW_NUMBER вовлечен где-то, но я не могу понять, как его использовать в этом случае.

Я подозреваю, почему мне не очень повезло, что мне трудно объяснить, что я пытаюсь сделать. Если мой вопрос не ясен, пожалуйста, не стесняйтесь сообщать мне, где я ошибаюсь, и я с удовольствием попробую еще раз. Возможно, я должен также упомянуть, что я пытаюсь поместить это в хранимую процедуру. Большое спасибо. Большое спасибо,

Ответ 1

В 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

В 2012 году это проще

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 

Ответ 2

В дополнение к правильному ответу @Martin Smith - при использовании GROUP BY вы не можете использовать OFFSET-FETCH без ORDER BY:

GROUP BY [cols]

ORDER BY [col] ASC|DESC

OFFSET  10 ROWS 
FETCH NEXT 10 ROWS ONLY 

Ниже приводится "неправильный syntaxt рядом с" OFFSET ":

GROUP BY [cols]

--ORDER BY [col] ASC|DESC

OFFSET  10 ROWS 
FETCH NEXT 10 ROWS ONLY