冗長なSQL記述の改善について
909529Jan 7 2012 — edited Jan 17 2012以下の商品表および商品名変換表から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.新商品名