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

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行に番号を付けます。

もう 1 つの可能性があります。行 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 に答える