わかってみれば単純な話ですが、すぐには気がつけませんでした。
photo credit: Parallels Desktop via photopin (license)
同じデータが表示される現象
お客さんからデータを見るためにページ送りをしていくと、49ページ目と50ページ目で、ほぼ同じデータが表示されると連絡がありました。確認してみると、確かにほぼ同じデータが表示されています。
同じデータが表示される原因
データベースからのデータの取得は、以下のクエリで行っていました。1ページに10件表示するので、サブクエリの480を、表示したいページに合わせて、(ページ番号-1) * 10 の式で計算しています。
SELECT TOP 10 * FROM table1 WHERE id NOT IN (SELECT TOP 480 id FROM table1 ORDER BY data1) ORDER BY data1;
49ページ目と50ページ目のクエリを作成して実行すると、確かに現象が再現されます。
なぜ発生するのかと考えたら、data1カラムに一意の制約はなく、同じデータが入っています。
そのため、クエリのたびに結果が一定にならず、今回の現象が発生していると気がつきました。
同じデータが表示されないようにするための対策
table1テーブル内で一意になるカラムはidカラムのみなので、SELECT TOP 10 * FROM table1 WHERE id NOT IN (SELECT TOP 480 id FROM table1 ORDER BY data1,id) ORDER BY data1,id;
とするのが確実な対策と判断しました。
辞めた同僚が作成した部分ですが、何年も発覚していませんでした。
今回は、data1カラムが同一のデータが20件入っていてページをまたぐために、現象が発生して気がつきました。
同一のデータがなかったり、ページをまたがなければ気がつくことはないですね。