SHOEISHA iD

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

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

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

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

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

  • このエントリーをはてなブックマークに追加

ダウンロード 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、出力結果は下記です。

getMaxRows
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が最大値の行を出力します。

修正対象のSQL
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 bymax関数を使って、IDごとのValの最大値を求めてから内部結合を行ってます。上記のSQLを可読性の高い記述で同じ結果を取得できるSQLに修正して下さい。

ヒント

 「IDごとにValが最大値の行を出力する」という日本語に近い表現のSQLに修正してみます。

会員登録無料すると、続きをお読みいただけます

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

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

メールバックナンバー

次のページ
修正後のSQLと解説

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

  • このエントリーをはてなブックマークに追加
Oracle SQLアンチパターンの問題集連載記事一覧
この記事の著者

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

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

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

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

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3231 2010/08/20 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング