SQLiteの集計クエリ(MaxやMin)では、非集計列もSelect句に指定出来ます。
便利!と思いますがデータ次第では不具合につながるので、使わないことをオススメします。
目次
検証1
例えば、テストの点数を格納した次のテーブル(test)がある場合
name | score |
---|---|
Aさん | 100 |
Bさん | 80 |
Cさん | 50 |
最高点をとった生徒の名前と点数を表示する検証を行ってみます。
最高点をとった生徒の名前と点数を表示
SQL
1 |
SELECT max(score), name FROM test; |
結果
非集計列(name)を指定したところ、最高点のAさんの名前が表示されました。
他のDBではSQL自体がエラーになりますが、SQLiteではエラーにならず結果が返ることに動揺してしまいます。
まぁ、結果が正しければいいか と思ってしまいがちですが、では最高点を取得した生徒が複数人いた場合はどうなるでしょうか?
検証2(最高点が複数人いる場合)
続いて先ほどのテーブル(test)にちょっとデータを追加して次のようにします。
名前 | 点数 |
---|---|
Aさん | 100 |
Bさん | 80 |
Cさん | 50 |
Dさん | 100 |
Eさん | 50 |
最高点がAさん、Dさんの二人になりました。
検証1と同様のSQLを実行すると
Aさんのみ返されました。残念ながらDさんは最高点をとっていないことになります。
ちなみに、最低点も二人(Cさん、Eさん)いるので最低点を取得するSQLも実行してみると
こちらも、Cさんのみ返されました。
まとめ
MaxやMin関数を使用する際、Select句に非集計列を含めることは出来ましたが
- 複数人いる場合、正しい結果が返されない。
- SQLiteから他のDBに移行した場合、SQLがエラーになる。
ことから、非集計列はSelect句に含めないことをオススメします。
ちなみに、以下のようにすることで正しい結果を取得することが出来ます。
SQL
1 2 3 |
SELECT score, name FROM test WHERE score = ( SELECT Max(score) FROM test ); |
結果