[pgsql-jp: 40653] order by asc offset limit での並び順について

apostleofwhom apostleofwhom @ gmail.com
2011年 1月 7日 (金) 02:06:07 JST


オハラと申します。

PostgreSQL-8.4.2
Linux(2.6.18-128.el5)

あるテーブルから20行ずつデータを取り出して、アプリ側で
ページングするようにしています。
SQLはこんな感じです。
SELECT * FROM member WHERE status=0 and seg!='' ORDER BY seg ASC OFFSET 20 LIMIT 20
SELECT * FROM member WHERE status=0 and seg!='' ORDER BY seg ASC OFFSET 40 LIMIT 20

seg 列は重複ありで、seg 列の値が同じデータが20件あります。
それらデータが、(アプリ側で)2ページ目と3ページ目に分かれているとき、
2ページ目で表示されていたデータのいくつかが、3ページ目に現れます。
2ページ目と3ページ目に表示されている当該データを数えると20件あるので
あるデータは表示されていないことになります。
また、表示されていないデータは常に表示されません。つまり2ページ目の
リストも3ページ目のリストも並びは固定されています。

この現象は仕様なのでしょうか。

もちろん、ページを跨がないときは正常に全てのデータが表示されます。
また、降順にすると
SELECT * FROM member WHERE status=0 and seg!='' ORDER BY seg DESC OFFSET 20 LIMIT 20
再現できません。つまり、期待通りに表示されます。

ソートする列を追加して user_id ASC すると(user_id はユニーク)正常に
表示されます。
SELECT * FROM member WHERE status=0 and seg!='' ORDER BY seg ASC, user_id ASC OFFSET 20 LIMIT 20

以上、これら現象に遭遇して不思議に思い、皆様のご意見をお伺いしたく
質問させていただきました。
どうぞよろしくお願いいたします。
-- 
apostleofwhom <apostleofwhom @ gmail.com>



pgsql-jp メーリングリストの案内