共通データベースページング
2289 ワード
1、Oracleページング
1つ目:分析関数row_を利用するnumber()メソッド
2つ目:rownum虚列を直接使用(推奨)
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関数で実現(推奨)
第2の方法:Max関数によって実現する
3つ目の方法:ROW_経由NUMBER関数+Topで実現
4つ目の方法:ROW_経由NUMBER関数+Between Andで実現
まとめ:
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
参照先:
たくさんのブログが・・・
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
参照先:
たくさんのブログが・・・