アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

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

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

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

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

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

A 回答 (4件)

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;

ですね。確認不足で申し訳ありません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/03/08 22:18

別に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.コード
;
    • good
    • 0

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



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の方が速そうな気がします。
    • good
    • 0

分けて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 ) 商品
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!