我用 选择了前 50,000 行TOP 50,000
,现在我想获得下一组 50,000。我不能使用ROW_NUMBER
,因为条目没有id
. 我在 SQL Server Management Studio 的帮助下使用 SQL Server 2012。
如何获得前 50,000 个之后的条目?
我用 选择了前 50,000 行TOP 50,000
,现在我想获得下一组 50,000。我不能使用ROW_NUMBER
,因为条目没有id
. 我在 SQL Server Management Studio 的帮助下使用 SQL Server 2012。
如何获得前 50,000 个之后的条目?
使用 SQL Server 2012,您可以在子句中获得 nextOFFSET
和FETCH 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 选项
如果您有某种方法可以确保结果的顺序一致,我看不出为什么您不能将 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 而不首先对结果进行排序将呈现不一致的结果,因为如果未明确指定,则无法保证顺序。