2012-10-10 37 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