1 Reply Latest reply: Jan 17, 2012 9:56 PM by nashiOracle RSS

    冗長なSQL記述の改善について

    909529
      以下の商品表および商品名変換表からSQL実行結果を得るためのSQLについて悩んでおり、質問させて頂きました。

      ・商品表
      商品名     年産
      A     2000
      A     2002
      Y     2002

      ・商品名変換表
      商品名     新商品名
      A     X
      B     X

      ・取得したいSQL実行結果
      商品名     年産     新商品名
      A     2000     X
      B     2000     X
      X     2000     X
      A     2002     X
      B     2002     X
      X     2002     X
      Y     2002     Y
      ※ 商品名には商品表のレコードと商品名変換表で当該レコードと同一の新商品名をもつ商品名および新商品名を加える
        年産には商品表のレコードと商品名変換表で当該レコードと同一の新商品名をもつものに同様の年産を設定する
        新商品名には、商品表の商品が商品名変換表に存在する場合、商品名変換表の新商品名とする
        新商品名には、商品表の商品が商品名変換表に存在しない場合、新商品名は商品表の商品名とする

              
      私が考えておりますSQLは以下の通りなのですが、記述が冗長であると感じております。もう少しスマートな記述法がありましたら教えて頂きたいと思っております。
      分かり辛い説明だとは思いますが、何卒宜しくお願いします。

      select coalesce(B.商品名,A.商品名) AS 商品名
      ,A.年産          AS 年産
      ,A.新商品名     AS 新商品名
      from (select 商品表.商品名     AS 商品名
      ,商品表.年産     AS 年産
      ,coalesce(商品名変換表.新商品名, 商品表.商品名) AS 新商品名
      from 商品表 left outer join 商品名変換表
      on 商品表.商品名 = 商品名変換表.商品名 ) A
      left outer join
      (select 商品名変換表.新商品名     AS 新商品名
      ,商品名変換表.商品名     AS 商品名
      from 商品名変換表
      where 商品名変換表.新商品名 <> 商品名変換表.商品名
      union all
      select distinct
      商品名変換表.新商品名     AS 新商品名
      ,商品名変換表.新商品名     AS 商品名
      from 商品名変換表 ) B
      on A.新商品名 = B.新商品名
        • 1. Re: 冗長なSQL記述の改善について
          nashiOracle
          冗長というのが、どのあたりを指しているのか判りませんが...
          ・副問い合わせをwith句でまとめた。
          ・テーブル名を別名にした。
          ・外部結合をOracle独自の構文にした。
          ・列名の別名定義は必要最小限にした。
          スマートな記述法であるかはともかく、参考になれば幸いです。
          with A as (select T.商品名 , T.年産 ,coalesce(C.新商品名, T.商品名) AS 新商品名
             from 商品表 T, 商品名変換表 C
              where T.商品名 = C.商品名(+)
          ),
          B as (select 新商品名, 商品名 from 商品名変換表
            union all
                select distinct 新商品名, 新商品名 AS 商品名
                  from 商品名変換表
          )
          select coalesce(B.商品名,A.商品名) AS 商品名,A.年産, A.新商品名
           from A, B
           where A.新商品名 = B.新商品名(+)
          [余談]
          なお、質問でご提示のSQLで、
          where 商品名変換表.新商品名 商品名変換表.商品名
          の行が余分だと思います

          Edited by: nashiOracle on 2012/01/18 12:56