• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複雑な2表の結合について)

複雑な2表の結合について

このQ&Aのポイント
  • 2つの表を結合し、特定の条件で集計を行いたい場合のSELECT文の作成方法を教えてください。
  • 表Aと表Bの関連付けにより、ROOM_CODE、ID、合計金額を返すSELECT文を作成したいです。
  • ORACLE9iのSQLPLUSを使用して、表Aの特定の列と表Bの特定の列を結合し、結果を返すSELECT文の作成方法を教えてください。

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

ビューにしたわけですね。今回のビューのレイアウト(厳密にはID,DATE,ROOM_NO)でテーブルを用意し、 そこから表Aのようなビューを作成するのが通常のデザインだと思います。 ちなみに表Aのレイアウトだと、PL/SQLでやってもあまり楽にはならないです。 PL/SQLで別アプローチを取るとしても、CAL01からCAL31までをデリミタ付で結合した文字列から、 指定ROOM_NOの登場件数をカウントする関数を作成するくらいですね。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

コメントが付かない理由は明らかで、 ・「CAL01~02の個数」「CAL01~29の個数」「CAL31の個数」などの集計範囲が何によって決まっているのか ・「個数」の定義 がわからないからです。 いずれにしても表Aのような構造(繰返し項目が存在するので非正規形です)である以上、NVL(CAL01,0)+NVL(CAL02,0)+.....+NVL(CAL29,0)のような相当ムゴいクエリになるのは不可避と思います。

ryozyryozy
質問者

お礼

コメントありがとうございます。 「個数」という表現が悪かったですね。。 それと何のための表かという説明がないのでイメージができなかったと思います。申し訳ありませんでした。 まず、表AのCAL01~31はカレンダーの1日から31日で、IDごとにそれぞれの日にいた部屋No.が格納されています。 それで最終結果として、部屋ごとのIDごとに合計金額を算出したいわけで、ID=1の場合ですと、CAL01~29に部屋No.=1におり、CAL30,31に部屋No.=2にいます。ID=2は、CAL01,02に部屋No.=1に、CAL03~CAL30に部屋No.=2に、CAL31に部屋No.=3にいます。 結論として、以下のような中間ビューを作成し、表Bと結合することで解決しましたが、PL/SQL等を使ってもっとスマートに書くことは可能なのでしょうか? create or replace view VIEW_XXXX ( ID,YYYYMMDD,ROOM_NO ) as (select ID,YYYYMM || '01',CAL01 from 表A union all select ID,YYYYMM || '02',CAL02 from 表A union all select ID,YYYYMM || '03',CAL03 from 表A ・ ・ ・ );

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 3つの表の外部結合

    表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。 外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の 書き方がわからず困っています。 ご教授いただけないでしょうか? select * from a,b,c where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+) としてみましたが、うまくいきませんでした。

  • 3つの表の外部結合

    3つの表があり、それぞれ次のデータが格納されているとします。 表A +-----+-----+-----+ |列A1 |列A2 | 列A3| +-----+-----+-----+ | A01 | B01 | A11 | | A02 | B02 | A12 | +-----+-----+-----+ 表B +-----+-----+-----+ |列B1 |列B2 |列B3 | +-----+-----+-----+ | B01 | X | B11 | | B01 | Y | B12 | | B02 | X | B13 | | B02 | Y | B14 | +-----+-----+-----+ 表C +-----+-----+ |列C1 |列C2 | +-----+-----+ | C01 | A11 | | C02 | A21 | | C03 | A12 | +-----+-----+ この場合、表Aと表BをA2とB1で等価結合し(但しB2='X') その結果導き出されたA3と表CのC2で外部結合し, B3の値を取得したいのです。 つまり、以下のような結果を得たいのです。 +-----+-----+ |列C1 |列B3 | +-----+-----+ | C01 | B11 | | C02 | null| | C03 | B13 | +-----+-----+ 表Aと表Bを結合した表を別名で定義し、 表Cと外部結合すれば可能だと思うのですが、 その様なやり方ではなく、 単純に3つの表を結合して行うことは出来ないのでしょうか。 尚、DBはORACLE9iです。

  • 外部結合に条件をつけたい

    oracle初心者です。 表A:ID、氏名 表B:ID、入社年、給与 上の表A,Bを、表Aを左辺にしてLEFT JOINする場合に、単純な外部結合では無く、 入社年が2000年以降の表Bのみ結合したい時のSQL文ですが、 select * from 表A LEFT JOIN 表B ON 表A.ID=表B.ID where 表B.入社年 > 2000 または、 select * from 表A,表B where 表A.ID=表B.ID(+) and 表B.入社年 > 2000 のように記述して実行すると、内部結合になってしまいます。 これを(外部結合として)実現するには、どのように記述すればよいでしょうか? 宜しくお願いいたします。

  • 表の結合について

    2つのテーブルがあります。(それぞれNo列が主キーです) 表A(名称:Tbl_A)に2レコードあります。 No, Str  ←列名 10,str_1  ←データ 20,str_2  ←データ 表B(名称:Tbl_B)に2レコードあります。 No, Name  ←列名 10,Name_1 ←データ 30,Name_3 ←データ このテーブルを結合して、以下のデータ(3レコード)を抽出するSQL文を教えてください。 No, Str, Name   ←列名 10,str_1,Name_1 ←データ 20,str_2,(null) ←データ 30,(null),Name_3 ←データ ポイントは、「どちらかの表にあるデータは全て抽出したい」ということです。 よろしくお願いします。

  • 同じフォーマットの違う表へのインポート

    Oracle8.1.7 表Aのデータを表A_WORKにインポートするにはどうした いいでしょうか? 1.A_WORKはcreateで表のガラは作成してます。 2.表AはEXPでDUMPを取得しました。 ここから表AのDUMPを表A_WORKにインポートしたいの ですが、SQLPLUS等でコマンドから出来ないでしょうか? 教えてください。

  • データベースの基礎かもしれませんが・・

    SQLの表結合についてですが、以下のような2つのテーブルを結合する場合、 表A ID,RENBAN,NO,NO1,NO2 1,1,1,1,0 1,2,2,1,2 表B ID,KUBUN,NO,SYOUSAI_NO 1,1,1,11111 1,1,2,22222 1,2,1,33333 1,2,2,44444 表BのKUBUNが1の場合、 from 表A inner join 表B on 表A.ID = 表B.ID and 表A.NO = 表B.NO 表BのKUBUNが2の場合、 from 表A inner join 表B on 表A.ID = 表B.ID and 表A.NO1 = 表B.NO および from 表A inner join 表B on 表A.ID = 表B.ID and 表A.NO2 = 表B.NO とした場合、以下の最終結果にしたいのですが・・・ ID,RENBAN,NO(SYOUSAI_NO),NO1(SYOUSAI_NO),NO2(SYOUSAI_NO) 1,1,11111,33333, 1,2,22222,33333,44444 そもそもこれは可能なのでしょうか? 意味わからなければ補足致します。 ご教示いただけますでしょうか?

  • テーブル結合の条件指定について

    以下のようなテーブルが3つある場合に2つのテーブルにあるポイントを合計して取得したいと思っています。 ただ、外部結合しているtable_cに条件を与えるとうまく取得できません。 table_cにcdがある場合は条件を指定し、 ない場合は条件を指定しないようにするにはどうすればいいのでしょうか。 【table_a】 id    name ------------------ a1    aaa a2    bbb a3    ccc 【table_b】 b_id     a_id   user_id    point --------------------------------- b1     a1    00001    5 b2     a1    00002    2 b3     a3    00007    10 b4     a2    00356    10 【table_c】 c_id    user_id    cd     bonus_point ------------------------------------------------ c1     00001    cd_1    1 c2     00007    cd_2    1 c3     00356    cd_1    1 SELECT table_b.user_id as user_id , (ifnull(table_b.age_count) + ifnull(table_c.bonus_point, 0)) as total_point FROM table_a INNER JOIN table_b ON (table_b.a_id=table_a.a_id)    LEFT JOIN table_c ON (table_c.user_id=table_b.user_id) WHERE table_c.cd = 'cd_1' ORDER BY total_point desc ■結果 user_id    total_point ----------------------------- 00356     11 00001      6 ■求めたい結果 user_id    total_point ----------------------------- 00356     11 00001      6 00002     2 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 外部結合?

    SQLについてです。 テーブルA ID 価格 タイプ 01 1,000 A01 02 2,000 B02 テーブルB ID 名前 種別 01 test a 03 aiue b 上記のようなテーブルがあったとして テーブルAとテーブルBを外部結合し 紐づくレコードがあった場合、さらに 種別=a で検索を行いたいのですが 書き方がよくわかりません。 外部結合で検索し、紐づくレコードがあった場合に さらに検索条件を絞る場合には どう書いたらいいのですか? よろしくお願いします。

  • 表の結合(性能)

    2つのテーブルを(内部)結合させる場合、 INNER JOINによる結合と WHERE句に結合条件を記述する2通りの方法が あると思いますが、どちらが早いのでしょうか? なお、Oracle9i、ルールベースにて構築されています。 テーブルの内容、SQL文は下記のとおりです。 ご教授よろしくお願いします。 ■表 A 項目A-1 ・・・PRIMARY KEY1、INDEX1 項目A-2 ・・・PRIMARY KEY2、INDEX2 項目A-3 ・・・PRIMARY KEY3 項目A-4 ■表 B 項目B-1 ・・・PRIMARY KEY1、INDEX1 項目B-2 ・・・PRIMARY KEY2、INDEX2 項目B-3 ・・・PRIMARY KEY3 項目B-4 ※項目A-1と項目B-1にて結合。  項目A-2が"01"と等しいレコード。 表Aのレコード件数>表Bのレコード件数 【WHERE句にて結合】 SELECT * FROM A,B where A.項目1 = B.項目1 and A.項目2 = '01' 【INNER JOINにて結合】 SELECT * FROM A INNER JOIN A ON A.項目1 = B.項目1 AND A.項目2 = '01'

  • SQLでテーブルを結合した結果を取り出し

    SQLで以下の様なテーブルがあります。 tableA、tableB、tableCを使って、IDとNUMとRANKを結合し、 ID毎に、 RANKが1つでもあったら、”○”でその数を RANKが1つもなかったら、”×”で0を 取り出したい。 「oracle10g」です。 -- tableA ID,NUM,NAME,・・・・・ 000001,001, 000001,002, 000001,003, 000002,001, 000003,001, 000003,002, -- tableB ID,NUM,RANK 000001,001,A 000001,001,B 000001,001,C 000001,002,A 000001,003,C 000002,001,B 000002,002,B 000003,001,A 000003,002,A 000003,002,C --tableC RANK,NAME A, B, C, 結果として、 ID,RANK,判定,個数 000001,A,○,2 000001,B,○,1 000001,C,○,2 000002,A,×,0 000002,B,○,2 000003,A,○,2 000003,B,×,0 000003,C,○,1 を得たいです。 どのようなSQLにしたらよいか、よろしくお願いします。