如何获得特定的结果块?

use*_*439 4 sql sql-server-2008

是否可以检索特定范围的结果?我知道如何做 TOP x 但我将检索的结果太大并且会超时。我希望能够选择前 10,000 个结果,然后是接下来的 10,000 个结果,依此类推。这可能吗?

Boh*_*ian 5

实际上,所有 SQL DB 实现都有一种指定要返回的起始行以及行的方法。

例如,在 mysql 和 postgres 中,它看起来像:

SELECT ...
ORDER BY something -- not required, but highly recommended
LIMIT 100 -- only get 100 rows
OFFSET 500; -- start at row 500
Run Code Online (Sandbox Code Playgroud)

请注意,通常您会包含一个ORDER BY以确保您的块是一致的

MS SQL Server(作为“假装”数据库)不直接支持 OFFSET,但可以使用它进行编码ROW_NUMBER()-有关更多详细信息,请参阅此 SO 帖子

  • 令人费解的是,为什么您认为不支持 OFFSET 会使 MS SQL Server 成为“假装”数据库,因为 ROW_NUMBER() 是 ANSI SQL,而 LIMIT/OFFSET 不是。 (5认同)
  • 嗯,每个 RDBMS 都有一些优点和一些缺点。我不是微软的粉丝,但我知道 SQL Server 在查询优化方面做了一些非常了不起的事情。它用于一些知名网站,包括 Stack Overflow。:-) (3认同)

Bil*_*win 5

WITH Q AS (
  SELECT ROW_NUMBER() OVER (ORDER BY ...some column) AS N, ...other columns
  FROM ...some table
) SELECT * FROM Q WHERE N BETWEEN 1 AND 10000;
Run Code Online (Sandbox Code Playgroud)

在这里阅读有关 ROW_NUMBER() 的更多信息: http://msdn.microsoft.com/en-us/library/ms186734.aspx