T-SQL Пропустить Хранимую Процедуру - PullRequest
21 голосов
/ 11 апреля 2011

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

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

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

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

Ответы [ 2 ]

59 голосов
/ 11 апреля 2011

за 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 
3 голосов
/ 10 июня 2014

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

GROUP BY [cols]

ORDER BY [col] ASC|DESC

OFFSET  10 ROWS 
FETCH NEXT 10 ROWS ONLY 

Следующее дает «неправильный синтаксис рядом с»OFFSET '":

GROUP BY [cols]

--ORDER BY [col] ASC|DESC

OFFSET  10 ROWS 
FETCH NEXT 10 ROWS ONLY 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...