2012-10-10 39 views
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之间选择

我该怎么办呢?

回答

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的方法对于靠近'前面'的页面来说可以这么说,但是对于后面的页面(高X和Y),row_number()会更好。这只是一个猜测 - 运行一些测试,看看什么适合你。

+0

谢谢让我试试:) – MonsterMMORPG

+0

好吧,这是工作,但我检查IO计数,它是非常高的。我不知道会有其他更好的性能解决方案 – MonsterMMORPG

+0

顶部y不会为我工作 – MonsterMMORPG