- ベストアンサー
Select文の作り方 (基礎的なことだと思います・・・)
Oracle9iを使っていますが、SELECT文がうまく作れずにいます。 どなたか教えて頂けませんでしょうか? 例えば以下のような3つのテーブルがあります。 オルガン練習時間テーブル 日付 曲名 時間 ピアノ練習時間テーブル 日付 曲名 時間 曲名テーブル 曲名 作曲家名 その中から1データを、日付範囲を指定して 【 日付 作曲家名 ピアノ練習時間 オルガン練習時間 】 という形で取得したいと思っていますが、 両方を練習した日もあれば片方だけ練習した日もあります。つまり 2005/02/09 ショパン 1.0 1.0 2005/02/10 バッハ 0.0 1.0 2005/02/10 ベートーベン 1.0 0.0 という風にしたいのですが、うまくSQL文を作れません・・・。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
合算するだけ? select 日付,曲名,sum(オルガン) as オルガン練習時間,sum(ピアノ) as ピアノ練習時間 from (select 日付,曲名,時間 as ピアノ,0 as オルガン from ピアノ練習時間テーブル union all select 日付,曲名,0 as ピアノ,時間 as オルガン from オルガン練習時間テーブル) where 日付の範囲指定 group by 日付,曲名
その他の回答 (1)
- ryk1234
- ベストアンサー率40% (46/113)
テーブル構造で無理があるような気がするんですが… (間違っていたらごめんなさい) 表示するデータの主キーって「日付」と「曲名」ですよね 練習テーブル 練習ID 日付 曲ID 練習時間テーブル 練習ID 楽器ID 時間 楽器テーブル 楽器ID 楽器名 曲名テーブル 曲ID 曲名 作曲家 こんなかんじのほうが扱いやすいと思うのですが
補足
さっそくのお返事ありがとうございます。 > 表示するデータの主キーって「日付」と「曲名」ですよね はい、その通りです。 「練習時間」を1つのテーブルにして、「楽器」のマスタを別に作った方が良い・・・という事ですよね。 ですが既に多くのデータが入っている上、他のプログラムにも使われているテーブルのため、今からリレーション関係を含めた大幅な構造の変更ができません・・・。 やはり2つのテーブルで管理している時間を、1データとして一括出力するのは無理なのでしょうか・・・ また何かありましたら、ぜひ教えて頂けたらと思っています。 ありがとうございました(^^)
お礼
お返事ありがとうございました。 UnionAllも知っているつもりでいましたが、ちゃんと理解できていませんでした・・・。 こういうのは「副問い合わせ」というものですよね? それも言葉は知っていても意味が分かっていませんでした。 頂いたSQL文を参考にして、1つ1つ確認しながら実行して初めて「こういうコトだったのか!」と、とっても感激しました! 欲しいデータが得られました(^^) 本当にありがとうございました!