条件に応じたSQL文の書き方

このQ&Aのポイント
  • 条件に応じたSQL文の書き方について困っています。特に、区分が0の場合と1の場合で異なるテーブルからデータを取得したいです。
  • DBはOracle10gです。テーブルAには区分とコードがありますが、区分が0の場合は得意先マスタから、区分が1の場合は商品マスタからデータを取得したいです。
  • お願いします。
回答を見る
  • ベストアンサー

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

お世話になっております。 以下の場合どのようにSQLを書くかで困っています。 どうかお願いします。 DBはOracle10gです。 テーブルA 区分   integer コード   integer(上記区分が0の場合は得意先のコード、1の場合は商品のコードが登録されています。) 得意先マスタ コード integer 名称 varchar 商品マスタ コード integer 名称 varchar 上記のテーブルAを読んで、 区分が0の場合は得意先マスタの名称 区分が1の場合は商品マスタの名称 をもってきたいのですがやり方がわかりません。 どうかよろしくお願いします。

  • Oracle
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

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; ですね。確認不足で申し訳ありません。

tm_kyokushin
質問者

お礼

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

その他の回答 (3)

  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.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.コード ;

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.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の方が速そうな気がします。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.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 ) 商品

関連するQ&A

  • SQL文を教えて下さい

    VB2008、SQL Server で開発をしています。 下記の条件でデータを取得したいのですが、SQL文がうまくできず、困っています。 おわかりの方、教えてください。 仕様:得意先マスタ(得意先M)の全件と、売上テーブル(売上T)を読みます。     売上テーブルの商品コードの商品名を商品マスタ(商品M)より取得します。     得意先マスタの全得意先を取得する必要があります。     すべての得意先の売上データが存在するわけではありません。 ACCESS上でクエリを作成し、SQLビューにすると、こうなります。 inptSyoCD:画面から入力した商品コード 1,まず、クエリ1: SELECT 売上T.伝票日付, 売上T.伝票番号, 売上T.得意先コード, 売上T.明細区分, 売上T.商品コード, 商品M.商品名称 FROM 売上T LEFT JOIN 商品M 売上T.商品コード = 商品M.商品名 WHERE 売上T.明細区分=1 AND 売上T.商品コード= inptSyoCD ; 2,次に、実際に処理するSQL文: SELECT 得意先M.得意先コード, 得意先M.得意先名称,       クエリ1.伝票日付, クエリ1.伝票番号, クエリ1.明細区分, クエリ1.商品コード, クエリ1.商品名  FROM 得意先M LEFT JOIN クエリ1 ON 得意先M.得意先コード = クエリ1.得意先コード ORDER BY 得意先M.得意先コード,売上T.伝票日付,売上T.商品コード; この2つをひとつのSQL文にする方法がわかりません。 よろしくお願いいたします。

  • SQL文をどう記述すれば良いか教えて下さい。

    テーブルAが以下の様に在るとします。 連番(ユニークキー)/日付/社員コード/所属コード そして、社員コード、所属コードの名称が、テーブルBに登録されています。 区分/コード/名称 ここで、区分+コードでユニークキーとなっていて、区分=1は社員コード、区分=2は所属コードとなっています。 単純に、テーブルAから、ある日付を指定して、連番・社員コード・所属コードを取得する場合、SQL文は以下の様になると思います。 SELECT 連番,社員コード,所属コード FROM テーブルA WHERE 日付='20030401' この時、同時に、テーブルBから社員コードに対応する名称、及び所属コードに対応する名称を取得したい場合は、どの様に記述すれば良いのでしょうか?

  • SQL文について

    下記の3つのテーブルがあります。 ・社員マスタ(TBL_SHAIN) ・得意先マスタ(TBL_TOKUI) ・地域マスタ(TBL_AREA) 各テーブルのフィールドは下記の通りです。 ・社員マスタ(TBL_SHAIN)  ・社員コード(shain_code)  ・社員名(shain_name)  ・役職タイプ(post_type)  ・地域コード(area_code) ・得意先マスタ(TBL_TOKUI)  ・得意先コード(tokui_code)  ・得意先名(tokui_name)  ・地域コード(area_code) ・地域マスタ(TBL_AREA)  ・地域コード(area_code)  ・地域(area_name)  ・分類コード(kind_type) ※社員マスタ(TBL_SHAIN)の地域コード(area_code)は配列型です。 社員マスタの地域コードには下記のような配列データが格納されています。 ・「{E01,E02,S01,T01,C03}」  ※この値は地域マスタ(TBL_AREA)の地域コード(area_code)です。 試しに 下記のSQLで配列データを下記のような形式に変換。  SELECT chr(39) || array_to_string(area_code, ''',''') || chr(39) FROM TBL_SHAIN;   「'E01','E02','S01','T01','C03'」 上記で出力した値('E01','E02','S01','T01','C03')で得意先マスタを検索できるかと思って下記のSQLを実行。 SELECT * FROM TBL_TOKUI WHERE area_code IN (SELECT chr(39) || array_to_string(area_code, ''',''') || chr(39) FROM TBL_SHAIN); 結果は空でした。 やりたい事は社員マスタ(TBL_SHAIN)の地域コード(area_code)と地域マスタ(TBL_AREA)の地域コード(area_code)を結合し、また得意先マスタ(TBL_TOKUI)の地域コード(area_code)と結合しようと考えています。 みなさんにアドバイスいただきたいのは社員マスタと得意先マスタと地域マスタを結合するにはどのようにしたらいいでしょうか。 また社員マスタの地域コードに該当する得意先を参照するにはどうしたらいいでしょうか。 どうか宜しくお願いします。

  • FOREIGN KEYの書き方

    オラクル9iを使っています たとえば ☆MST_商品テーブル        ・商品コード  varchar2(10) 主キー  ・分類区分   varchar2(10)  ・商品名称   varchar2(30)  ・仕入先コード varchar2(10) ☆MST_仕入先テーブル  ・仕入先コード varchar2(10)主キー  ・仕入先名称  varchar2(30)    ・取引区分   varchar2(30) があったとして 商品テーブルの仕入先コードと仕入先テーブルの仕入先コードにFOREIGN KEYを使ってリレーションを張りたい場合どのようにSQL文は書いたらいいのでしょうか? ☆CREATE TABLE MST_仕入先    (仕入先コード varchar2(10) NOT NULL,     仕入先名称 varchar2(30), 取引区分 varchar2(30), ALTER TABLE MST_仕入先 ADD CONSTRAINT PMST_仕入先 PRIMARY KEY(仕入先コード); と CREATE TABLE MST_商品 (商品コード varchar2(10),     分類区分 varchar2(10)     商品名称 varchar2(30), 仕入先コード varchar2(10), ALTER TABLE MST_商品 ADD CONSTRAINT PMST_商品 PRIMARY KEY(商品コード); でテーブルと主キーを設定し ALTER TABLE MST_商品 ADD CONSTRAINT FMST_商品 FOREIGN KEY(仕入先コード) REFERENCES MST_仕入先(仕入先コード); ほかにもいろいろ試したのですが にっちもさっちもいかないのでよろしくお願いします。

  • SQLの作成について

    SQLの作成について 以下のようなDBがあるとします。 ---------------------- DB1(マスタ)  区分   フラグ  名称   A    1    男   A    2    女   B    1    車   B    2    飛行機   B    3    電車   C    1    コンビニ   C    2    スーパー   C    3    百貨店   D    1    デスクトップ   D    2    ノート ---------------------- ----------------------- DB2  区分1 フラグ1 名称1 ・・・ 区分4 フラグ4 名称4   A   2           D    1 ----------------------- DB2の区分とフラグから、DB1を参照して 取ってきたDB1の名称をDB2に書き込みたいです。 名称の1つ毎に、SQLを発行し、それぞれ名称を取得するなら where DB1.区分=DB2.区分 and DB1.フラグ = DB2.フラグ みたいな感じでそのまま出来ると思いますが、 今は、1つのSQLでDB2の複数の名称を一気に取得したいと考えてます。 どのようなSQLが良いのでしょうか

  • SQL文 グループ集計TOPに対する明細

    すみません、教えてください。 得意先の売上額上位10社のそれぞれについて、仕入合計額上位10商品のリストを出力するSQL 文をがわからなくて困っています。 できれば、一般的なSQL文(SQL92)でお願いします。 テーブルは、下記の2つです。 -------------------------------------------- ・t_売上明細  売上日  得意先コード  商品コード  売上金額 ・t_商品マスタ  商品コード  仕入単価 <出力>====================================== 得意先コード, 売上合計,商品コード,仕入額合計 -------------------------------------------- C3 \300100    A08 \32500     A04 \31000     ~~~    A10 \30000(Top10) C2 \200200    A05 \22500    A04 \21000     ~~~     A10 \20000(Top10) ~~~ ~~~ C10 \1000(Top10)    A97 \500    A14 \100    ~~~    A96 \10(Top10) ================================

  • 異なるデータベース間のテーブル結合

    DB名:db1 TABLE名:得意先マスタ DB名:db2 TABLE名:ユーザマスタ 以上のように、異なるデータベースに存在する2つのテーブルをLEFT JOINさせたいです。 結合条件は ユーザマスタ.得意先コード = 得意先マスタ.得意先コード とします。 この場合の結合方法を教えてください。 以下のようなSQL文を書いても駄目でした。 SELECT * FROM db1.ADMINISTRATOR.得意先マスタ AS  得意先マスタ   LEFT OUTER JOIN db2.ADMINISTRATOR.ユーザマスタ AS ユーザマスタ ON ユーザマスタ.得意先コード = 得意先マスタ.得意先コード よろしくお願いいたします。

  • 以下のようなSQLについて教えてください。

    売上トランと商品マスタがあるとします。 商品マスタは廃止フラグをVARCHAR2(1)で保持していて、 1なら廃止、0なら今販売中で、 商品マスタは全件で100万件あり、そのうち95万件は既に廃止になっているとします。 このとき、 SELECT 売上トラン.* , 商品マスタ.商品名称 FROM 売上トラン INNER JOIN 商品マスタ ON 売上トラン.商品コード = 商品マスタ.商品名称 WHERE 商品マスタ.削除フラグ = '0' と書くのと、 SELECT 売上トラン.* , 商品マスタ.商品名称 FROM 売上トラン INNER JOIN (SELECT * FROM 商品マスタ WHERE 商品マスタ.削除フラグ = '0') 商品マスタ ON 売上トラン.商品コード = 商品マスタ.商品名称 と書くのだと、検索は下の方が速くなったりしますか? イメージですが、 上だと全件同士でくっつけた後で削るのに対して、 下だと削って5万件だけになったものをっつけていて、下の書き方の方が良いのかな? と思ったものの、どこかの本などでこういう書き方が良いと読んだわけではないので、 イメージであっているのか、それとも変わらないのか質問しました。 また、削除フラグのように1か0の2値しかとらない項目については、 INDEXを張る効果はあるでしょうか? ちなみにverで挙動が変わるかわかりませんが、環境はoracle11gを想定した場合となります。

  • SQL文で質問

    SQL文で質問 いつもお世話になっております。 SQL文について質問です。 仮にですが、商品マスタというテーブルと、対応テーブルという二つのテーブルがあります。 対応テーブルには、商品コードが親コード、子コードといった形で構成されています。 対応テーブルのいくつかの親のコードを条件に、親コードと子コードを検索して、それぞれの商品名を検索したいと思っています。 現在、SQL文で、親コードに対応した商品名だけを取得しているのですが、子コードに対応する商品名も検索したいと思っています。 現在のSQL分としては、 SELECT 対応テーブル.親コード、商品マスタ.商品名、対応テーブル.子コード FROM 対応テーブル,商品マスタ WHERE 対応テーブル.親コード = 商品マスタ.商品コード AND 対応テーブル.親コード = 1000,1002,1004 このSQL文で検索した子コードで、商品マスタの商品名を検索したいのですが、どのようなSQLを書いたらよいのでしょうか。 ご教授願います。

  • mdbからのデータ取得をSQLで行いたいのですが・・・

    VB.NETで開発中です。 “TEST”という名称のmdb(MS-Access)のDBに接続し、“区分マスタ”というテーブルからデータを取得したいのですが、これをSQL文で行いたいと思っています。 サンプル的なコードを記述して教えていただけると助かります。 よろしくお願い致します。