読者です 読者をやめる 読者になる 読者になる

ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

結果が一定にならないため、再度同じデータが表示される現象が発生

スポンサーリンク

わかってみれば単純な話ですが、すぐには気がつけませんでした。

f:id:AJYA:20151221053908j:plain
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件入っていてページをまたぐために、現象が発生して気がつきました。
同一のデータがなかったり、ページをまたがなければ気がつくことはないですね。