共通データベースページング


1、Oracleページング
1つ目:分析関数row_を利用するnumber()メソッド
select * from(
   select t.*,row_number() over (order by t1.id) rowno from TABLE1
)
where rowno between 21 and 40;

2つ目:rownum虚列を直接使用(推奨)
select * from
(select t.*,rownum as rowno from TABLE1 )
where rowno between 10 and 20

3つ目:between andを使用しないでページングする
SELECT * FROM
    (SELECT A.* ,  rownum r  
    FROM
        (SELECT  *  FROM msr_topic
        Where name like %hr%
        ) A
    WHERE rownum <= indexEnd
    ) B
WHERE r > indexStart;
総括:明らかに第2の方法は比較的に良くて、第3の方法は最も悪いです!order by文を使用しないと、データの取得速度が向上するため、特にデータ量が大きいほど、第2の方法はデータの迅速な取得が顕著になります.oracleではorder by付きのページングを慎みます.特にoracle 10 gでは、同じレコードが異なるページに表示されると混乱を引き起こす. 
2、SqlServerページング
1つ目の方法:TOP関数で実現(推奨)
SELECT TOP 10 * FROM TestTable 
WHERE (
    id NOT IN (SELECT TOP 20 * FROM TestTable ORDER BY id)
)
ORDER BY ID

第2の方法:Max関数によって実現する
select top limit *
from table1
where id>
(select max (id) from
    (select top ((page-1)*limit) id from table1 order by id) as T
)
order by id

3つ目の方法:ROW_経由NUMBER関数+Topで実現
SELECT TOP limit * 
FROM
(
   SELECT top limit ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNo
   FROM TABLE
) AS A
WHERE RowNo > page*10

4つ目の方法:ROW_経由NUMBER関数+Between Andで実現
select *
 from
    (select  *  ROW_NUMBER( )over( order by u_id )  as  row_id
    from users
    where u_name like %hr%
    )  as  temp_users
Where  row_id between  ${start}  and  ${end}

まとめ:
1)第一の方法には致命的な欠点がある.それはNOT INの字を含み、not inの代わりにnot existsを使うことである.
2)第2の方法はIDが一意でなければならないことに注意して、複合主キーを使用することができなくて、その上主キーも規則的な数字でなければならなくて、さもなくば比較することができません
3)第3の方法ROW_NUMBER()は、順序を生成する行番号であり、順序を生成する基準は、後続のOVER(ORDER BY ReportID)であり、ReportIDは連合プライマリ・キーであってもよい.関数を持参するときが一番悪いのは言うまでもありませんが、この方法は使わないでください.
4)第3の方式と同様に、効率が低い
3、mysqlページング
select   *   from   table   limit   start , size
4、PostgreSQLページング
select   *   from   table   limit  size offset start  
参照先:
たくさんのブログが・・・