T-SQL 跳过存储过程
Posted
技术标签:
【中文标题】T-SQL 跳过存储过程【英文标题】:T-SQL Skip Take Stored Procedure 【发布时间】: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 语句。再次感谢您。
【参考方案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
【讨论】:
以上是关于T-SQL 跳过存储过程的主要内容,如果未能解决你的问题,请参考以下文章