1

这是一个非常复杂的查询,所以我在这里遇到了困难。如果你帮助我,我很感激。

select AvgLevel,TotalCount,tblPokedex.PokemonId,Name,Type1,Type2,Hp,tblPokedex.Attack,tblPokedex.Defense,tblPokedex.SpAttack,tblPokedex.SpDefense,tblPokedex.Speed,(Hp+tblPokedex.Attack+tblPokedex.Defense+tblPokedex.SpAttack+tblPokedex.SpDefense+tblPokedex.Speed) as TotalStats 
from tblPokemonStats,tblAvailablePokemons,tblPokedex 
left join tblUsersPokemons on tblPokedex.PokemonId=tblUsersPokemons.PokemonId 
where tblPokemonStats.PokemonId=tblPokedex.PokemonId 
group by tblPokedex.PokemonId,tblPokedex.Name,tblPokedex.Type1,tblPokedex.Type2,tblPokedex.Hp,tblPokedex.Attack,tblPokedex.Defense,tblPokedex.SpAttack,tblPokedex.SpDefense,tblPokedex.Speed,tblPokemonStats.AvgLevel,tblPokemonStats.TotalCount  
order by PokemonId asc

好吧,我想做的是例如在前 100 名和 150 名之间进行选择

我怎样才能做到这一点 ?

4

1 回答 1

1

这是一种方法-添加row_number列并对其进行过滤:

select AvgLevel /*...*/
from (
    select AvgLevel /*...*/, row_number() over (order by PokemonId) rownum 
    from tblPokemonStats,tblAvailablePokemons,tblPokedex 
    left join tblUsersPokemons on tblPokedex.PokemonId=tblUsersPokemons.PokemonId 
    where tblPokemonStats.PokemonId=tblPokedex.PokemonId 
    group by /* etc ... */
) A
where A.rownum > 100 and A.rownum <= 150

row_number听起来像 - 它为你的行编号。

这是另一种可能性 - 假设您想要 X 到 Y 行。您可以TOP Y根据您的顺序选择行。然后使用该子查询并TOP Y-X根据相反的顺序选择。假设 X = 100 且 Y = 150:

select top 50 *
from (
    select top 150 PokemonId
    from tblPokemonStats
    order by PokemonId
) A
order by PokemonId desc

至于性能,我不确定哪个会更好。我的直觉说,可以说这种ORDER BY方法更适合靠近“前”的页面,但row_number()更适合后面的页面(高 X 和 Y)。这只是一个猜测——运行一些测试,看看什么对你有用。

于 2012-10-10T22:27:11.597 回答