はじめに
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に修正してみます。
