Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

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

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2010/08/20 14:00

ダウンロード 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に修正してみます。


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

著者プロフィール

バックナンバー

連載:Oracle SQLアンチパターンの問題集
All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5