【问题标题】:T-SQL Skip Take Stored ProcedureT-SQL 跳过存储过程
【发布时间】:2011-08-03 00:11:14
【问题描述】:

我似乎在这个网站上运气不佳,仍然永远是乐观主义者,我会继续努力。 我有两个表,Journals 和 ArticleCategories 使用此查询连接:

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

谁能告诉我如何将它重新编写成一个 Skip, Take 查询。 换句话说,我希望它跳过前 n 条记录,然后取下 n 条记录。 我认为 ROW_NUMBER 涉及到某处,但我不知道在这种情况下如何使用它。

我怀疑运气不好的原因是我很难解释我想要做什么。 如果我的问题不清楚,请随时告诉我哪里出错了,我很乐意再试一次。 也许我还应该提到我正在尝试将其放入存储过程中。 非常感谢。 非常感谢,

【问题讨论】:

  • first n records - 按什么顺序排列?
  • 好点!我忘了提到它需要由某些东西订购。我能否再次强加给您并询问如何包含 ORDER BY Journals.Year?非常感谢马丁。
  • 对不起我之前的评论马丁。如果我再小心一点,我会注意到你已经包含了一个 ORDER BY 语句。再次感谢您。

标签: sql sql-server tsql pagination


【解决方案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 时,你不能在没有ORDER BY 的情况下使用OFFSET-FETCH

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 

【讨论】:

    猜你喜欢
    • 2018-10-03
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 2013-06-26
    • 2017-03-30
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多