はじめに
OracleのSQLのアンチパターンとして、メンテナンス性や可読性の悪いSQLと、修正したSQLを問題集形式で紹介します。
対象読者
- SQLの理解を深めたい方。
必要な環境
本稿で扱うSQLは、Oracle 11.2.0.1.0で動作確認しました。他のDBでも応用が可能です。
1. 最大値の行を取得するSQLのアンチパターン
最大値の行を取得するSQLを考えます。サンプルデータ、修正対象のSQL、出力結果は下記です。
ID | Val | extraCol |
111 | 10 | EEEE |
111 | 30 | CCCC |
111 | 50 | AAAA |
222 | 20 | BBBB |
222 | 40 | DDDD |
222 | 40 | FFFF |
333 | 80 | GGGG |
IDごとにValが最大値の行を出力します。
select a.ID,a.Val,a.extraCol from getMaxRows a,(select ID, max(Val) as maxVal from getMaxRows group by ID) b where a.ID = b.ID and a.Val = b.maxVal order by a.ID,a.extraCol;
ID | Val | extraCol |
111 | 50 | AAAA |
222 | 40 | DDDD |
222 | 40 | FFFF |
333 | 80 | GGGG |
上記のSQLでは、IDごとにValが最大値の行を出力するために、インラインビューでgroup by
とmax
関数を使って、IDごとのValの最大値を求めてから内部結合を行ってます。上記のSQLを可読性の高い記述で同じ結果を取得できるSQLに修正して下さい。
「IDごとにValが最大値の行を出力する」という日本語に近い表現のSQLに修正してみます。