0

我用 选择了前 50,000 行TOP 50,000,现在我想获得下一组 50,000。我不能使用ROW_NUMBER,因为条目没有id. 我在 SQL Server Management Studio 的帮助下使用 SQL Server 2012。

如何获得前 50,000 个之后的条目?

4

2 回答 2

4

使用 SQL Server 2012,您可以在子句中获得 nextOFFSETFETCH NEXT关键字。ORDER BY

因此,您可以选择前 50'000 行:

SELECT (list of columns)
FROM dbo.YourTable
WHERE (some condition)
ORDER BY (some column)
  OFFSET 0 ROWS FETCH NEXT 50000 ROWS ONLY

然后是下一个 50'000 之后:

SELECT (list of columns)
FROM dbo.YourTable
WHERE (some condition)
ORDER BY (some column)
  OFFSET 50000 ROWS FETCH NEXT 50000 ROWS ONLY

只是一个旁注:50'000 行的页面大小似乎过大 - 1'000 或其他东西怎么样?

有关更多详细信息和背景信息,请参阅使用新的 OFFSET 和 FETCH NEXT 选项

于 2013-07-27T08:56:31.083 回答
0

如果您有某种方法可以确保结果的顺序一致,我看不出为什么您不能将 row_number 与这样的公用表表达式一起使用:

;WITH CTE AS
(
    SELECT *, ROW_NUMBER() OVER(ORDER BY something_unique DESC) AS 'Row'
    FROM my_table   
)
-- To get the first 50k rows:
SELECT * FROM CTE WHERE Row BETWEEN 0 AND 50000 
-- To get the next 50k rows:
--SELECT * FROM CTE WHERE Row BETWEEN 50001 AND 100000

尽管您只需要 50k,但当您在整个表上构建行号时,它并不是很有效。如果可能,您可能需要考虑在源表中添加一个额外的列以包含一些人工编号。

如评论中所述,仅使用 TOP X 而不首先对结果进行排序将呈现不一致的结果,因为如果未明确指定,则无法保证顺序。

于 2013-07-27T08:07:19.203 回答