T-SQL Skip Take 存储过程

22

我在这个网站上似乎没有太多的好运,不过作为永远的乐观主义者,我将继续尝试。 我有两个表,Journals和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在这里有所涉及,但我不知道如何在这种情况下使用它。

我怀疑我没有太大的成功可能是因为我很难解释我想做什么。 如果我的问题不清楚,请毫不犹豫地告诉我我哪里错了,我会很高兴再试一次。 也许我还应该提一下,我正在尝试将这个查询放在存储过程中。 非常感谢。


首先n条记录 - 按什么顺序排序? - Martin Smith
好的,我忘了提到它需要按某种方式排序。能否再次麻烦您告诉我如何包括“ORDER BY Journals.Year”?非常感谢,Martin。 - Pete Davies
抱歉之前的评论有些失礼,马丁。如果我当时更仔细一些,就会注意到你已经包含了一个ORDER BY语句。再次感谢你。 - Pete Davies
2个回答

62

适用于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 

1
太棒了!谢谢Martin,那个完美地运行了。非常感激。 - Pete Davies

3
除了@Martin Smith的正确答案之外,在使用GROUP BY时,如果没有ORDER BY,就不能使用OFFSET-FETCH:
GROUP BY [cols]

ORDER BY [col] ASC|DESC

OFFSET  10 ROWS 
FETCH NEXT 10 ROWS ONLY 

以下是“OFFSET 附近的语法错误”:
以下是“在‘OFFSET’附近的语法错误”:
GROUP BY [cols]

--ORDER BY [col] ASC|DESC

OFFSET  10 ROWS 
FETCH NEXT 10 ROWS ONLY 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接