Процедура прокрутки 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