こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

条件に応じたSQL文について

お世話になっております。

以下の場合どのようにSQLを書くかで困っています。
どうかお願いします。
DBはOracle10gです。

テーブルA
区分   integer
コード   integer(上記区分が0の場合は得意先のコード、1の場合は商品のコードが登録されています。)

得意先マスタ
コード integer
名称 varchar

商品マスタ
コード integer
名称 varchar

上記のテーブルAを読んで、
区分が0の場合は得意先マスタの名称
区分が1の場合は商品マスタの名称
をもってきたいのですがやり方がわかりません。

どうかよろしくお願いします。

投稿日時 - 2011-03-08 16:18:38

QNo.6578666

困ってます

質問者が選んだベストアンサー

No.2です。
2個目のSQLを訂正します。

select テーブルA.区分, テーブルA.コード, 得意先マスタ.名称
from テーブルA
--left join 得意先マスタ on テーブルA.コード = 得意先マスタ.コード
inner join 得意先マスタ on テーブルA.コード = 得意先マスタ.コード
where テーブルA.区分 = 0
union all
select テーブルA.区分, テーブルA.コード, 商品マスタ.名称
from テーブルA
--left join 商品マスタ on テーブルA.コード = 商品マスタ.コード
inner join 商品マスタ on テーブルA.コード = 商品マスタ.コード
where テーブルA.区分 = 1;

ですね。確認不足で申し訳ありません。

投稿日時 - 2011-03-08 17:06:00

お礼

ありがとうございました。おかげで納得いく答えを導き出せました。

投稿日時 - 2011-03-08 22:18:07

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

別にUNIONせずとも、以下でよい気がします。
テーブルAは一回しか読みません。

select a.コード,case when a.区分 = 1 then b.名称 else c.名称 end as 名称
from テーブルA as a
left outer join 得意先マスタ as b
on a.区分 = 0
and a.コード = b.コード
left outer join 商品マスタ as c
on a.区分 = 1
and a.コード = c.コード
;

投稿日時 - 2011-03-08 19:14:22

ANo.2

こんな感じでどうでしょうか。

select テーブルA.区分, テーブルA.コード, case when テーブルA.区分 = 0 then 得意先マスタ.名称 else 商品マスタ.名称 end 名称
from テーブルA
left join 得意先マスタ on テーブルA.コード = 得意先マスタ.コード and テーブルA.区分 = 0
left join 商品マスタ on テーブルA.コード = 商品マスタ.コード and テーブルA.区分 = 1;

もしくは

select テーブルA.区分, テーブルA.コード, 得意先マスタ.名称
from テーブルA
left join 得意先マスタ on テーブルA.コード = 得意先マスタ.コード
where テーブルA.区分 = 0
union all
select テーブルA.区分, テーブルA.コード, 商品マスタ.名称
from テーブルA
left join 商品マスタ on テーブルA.コード = 商品マスタ.コード
where テーブルA.区分 = 1;

union allの方が速そうな気がします。

投稿日時 - 2011-03-08 17:03:26

ANo.1

分けてJOINしてからUNION ALLでくっつけるというのは。
select 得意先.* from
(select A.区分,A.コード,M.名称
from テーブルA A inner join 得意先マスタ M
on A.コード=M.コード
where A.区分 = 0 ) 得意先
union all
select 商品.* from
(select A.区分,A.コード,M.名称
from テーブルA A INNER JOIN 商品マスタ M
on A.コード=M.コード
where A.区分 = 1 ) 商品

投稿日時 - 2011-03-08 17:01:56

あなたにオススメの質問