0
0

SQL 「ORDER BY」取得順序について

Posted at

新人エンジニアの三上です。
今回は、Junit のテスト(DB への insert 処理あり)をローカル(PostgreSQL)で実施した場合と、Azure(SQL Server) で build した場合に不一致となり、エラーの原因調査に時間がかかるということがあったので、その原因と解決策を書いていこうと思います。

ORDER BY

SQL の SELECT文に「ORDER BY」句を使用することで、レコードの取得順序を指定することが出来る。

以下のようなレコードを登録している状態で、実際に使用した結果、取得されるレコードを例示する。

sample テーブル

record_no register_info register_dt
1 AAA 2024-08-31
2 BBB 2024-09-01
3 CCC 2024-08-30
SQL
SELECT record_no, register_info, register_dt
FROM sample
ORDER BY register_dt ASC;

上記の Query により取得されるレコードを以下に示す。

取得レコード

record_no register_info register_dt
3 CCC 2024-08-30
1 AAA 2024-08-31
2 BBB 2024-09-01

重複日付のレコード出力順序

以下のように登録日付が重複しているレコードに対して、「ORDER BY」句を使用するとレコードの取得順序はどうなるか?

sample_duplication

record_no register_info register_dt
1 AAA 2024-08-30
2 BBB 2024-08-30
3 CCC 2024-08-30
SQL
SELECT record_no, register_info, register_dt
FROM sample
ORDER BY register_dt ASC;

結果は、使用環境に依存する。

解決策

解決策として実際に使用したのは、Junit の insert 処理の際に登録日付を同じものにしない。
もう1つ考えられるものとしては、「ORDER BY」句に指定するカラムを追加するというものである。
そうすることで、1つの条件に依存せず、想定通りにレコードを取得することができる。

まとめ

ローカルではテストが成功するが、開発環境で biuld するとエラーを起こすとき、
DBを使用するテストでエラーを起こしている場合、レコードの取得順序を疑ってみて欲しい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0