Sql 从查询中获取节

Sql 从查询中获取节,sql,Sql,假设我有一个包含100万个视频游戏高分的表格,其中有一个整数列score。当用户询问前50个分数时,我会从highscores order by score desc limit 50中选择*。简单。但是如果用户要求51到100分怎么办?我可以选择前100行,然后在与数据库接口的程序中忽略前50行;但那将是浪费。如果他们要第200000到200100行呢?效率低下只会变得更糟 您可以查询另一个查询的结果-看起来您必须始终选择较大数字的大小: select * from ( select

假设我有一个包含100万个视频游戏高分的表格,其中有一个整数列
score
。当用户询问前50个分数时,我会从highscores order by score desc limit 50中选择*。简单。但是如果用户要求51到100分怎么办?我可以选择前100行,然后在与数据库接口的程序中忽略前50行;但那将是浪费。如果他们要第200000到200100行呢?效率低下只会变得更糟

您可以查询另一个查询的结果-看起来您必须始终选择较大数字的大小:

select * from (
    select * from highscores order by score desc limit 100
)
order by score asc limit 50
在这里,我们选择前100名的分数,从中,我们从100人中选择50名最低的分数。
更好的解决方案是在分数列中添加一个索引,如果您想要顶部的
x
y
高分,您只需选择从行
x
到行
y
的所有内容。请参见sql server(2008+)中的“关于按范围选择行”。

您可以使用行数()获取行的范围

with topScores as
(
 select *,row_number() over(order by score desc) rowNum  from highscores  
)
select * from topScores where (rowNum between 1 and 100) -- or rowNum between 101 and 200

或使用<强> DeNeSyRANK()<强>考虑相同顺序相同的游戏,如下图

with topScores as
(
  select *,dense_rank() over(order by score desc) scoreOrder  from highscores  
)
select * from topScores where (scoreOrder between 1 and 100) -- or scoreOrder between 101 and 200
在sql server 2012中+ 可以使用偏移获取子句(但是它不会考虑一个分数相同的游戏) 此示例用于获取101到200之间的高分行

SELECT * FROM highscores ORDER BY score Desc OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;