SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Oracle SQLアンチパターンの問題集

OracleのSQLのアンチパターンの問題集2

from句のテーブル数を減らす

ダウンロード SourceCode (1.1 KB)

修正後のSQLと解説

相関サブクエリを使用

修正後のSQL1(相関サブクエリを使用)
select ID,Val,extraCol
  from getMaxRows a
 where Val = (select max(b.Val)
                from getMaxRows b
               where b.ID = a.ID)
order by ID,extraCol;

 大本のselect文のfrom句に指定されたテーブルが2個から1個に減りました。大本のselect文のfrom句のテーブルが1つになったことにより、表別名のaやbでの列修飾がほとんど不要になり、可読性が向上しました。

 また、「IDごとにValが最大値の行を出力する」という日本語の表現に近いSQLになりましたので、可読性が向上しました。

分析関数を使用

 分析関数のmax関数を使ってIDごとのValの最大値を求めてから、where句で条件として使うのも、可読性の高いSQLだと思います。

修正後のSQL2(分析関数を使用)
select ID,Val,extraCol
from (select ID,Val,extraCol,
      max(Val) over(partition by ID) as maxVal
        from getMaxRows)
where Val = maxVal
order by ID,extraCol;

 上記のSQLのイメージは下記です。分析関数のmax関数に対応する黄緑線と、partition by IDに対応する赤線を引いてます。

SQLのイメージ
SQLのイメージ

参考リンク

次のページ
2. 共通集合を取得するSQLのアンチパターン

この記事は参考になりましたか?

Oracle SQLアンチパターンの問題集連載記事一覧
この記事の著者

山岸 賢治(ヤマギシ ケンジ)

趣味が競技プログラミングなWebエンジニアで、OracleSQLパズルの運営者。AtCoderの最高レーティングは1204(水色)。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3231 2010/08/20 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー