2013-07-27 34 views
0

我选择了第一个50000行TOP 50,000,现在我想要得到下一个50,000的组。我无法使用ROW_NUMBER,因为条目没有id。我在SQL Server Management Studio的帮助下使用SQL Server 2012。选择接下来的50000个条目

如何获得第一个50,000后的条目?

+5

如果您在某列(例如您所说的id不存在的情况下)选择了没有'ORDER BY'的'top 50000',那么不能保证即使重新运行*相同*查询将返回* 50000行*更不用说任何方式来保证能够获得“下一个”50000。 –

回答

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 

这并不是虽然非常effecient即使您只需要50k,也可以在整个表上构建行号。如果可能的话,你可能要考虑在源表中增加一个额外的列来包含一些人工编号。

正如在注释中所指出的那样,如果没有明确指定,只是使用TOP X而没有先排序结果会导致结果不一致,因为顺序不能保证。

3

使用SQL Server 2012,您将获得ORDER BY子句中的下一个OFFSETFETCH NEXT关键字。

这样你就可以选择第50000行:

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

再下50000与更高版本:

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什么

见?了解更多详细信息和背景信息