ダウンロード SourceCode (1.1 KB)
OracleのSQLのアンチパターンとして、メンテナンス性や可読性の悪いSQLと、修正したSQLを問題集形式で紹介します。今回はselect文のfrom句のテーブル数を減らせるSQLについて考えてみます。
はじめに
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に修正してみます。
この記事は参考になりましたか?
- Oracle SQLアンチパターンの問題集連載記事一覧
-
- OracleのSQLのアンチパターンの問題集2
- OracleのSQLのアンチパターンの問題集1
- この記事の著者
-
山岸 賢治(ヤマギシ ケンジ)
趣味が競技プログラミングなWebエンジニアで、OracleSQLパズルの運営者。AtCoderの最高レーティングは1204(水色)。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
