- 締切済み
テーブル結合のSQL文について
はじめまして、よろしくお願いします。 テーブルA、B、Cから情報を取得し、下記のSELECTイメージを表示させたいのですが、 どのようなSQLを記述すれば良いのかわからず、困っております。 どなたかご教示頂けますでしょうか。 SELECTイメージ 日付 キー ------------ ------------- 9/1 AAAAA 9/1 CCCCC 9/2 AAAAA 9/2 CCCCC 9/3 AAAAA 9/3 BBBBB 9/3 CCCCC 9/4 AAAAA 9/4 BBBBB 9/4 CCCCC テーブルA 日付 キー ------------- ------------- 8/31 AAAAA 8/31 CCCCC テーブルB 日付 キー ------------ ------------- 9/1 AAAAA 9/3 BBBBB 9/4 CCCCC テーブルC 日付 ------------- ・ ・ ・ 8/31 9/1 9/2 9/3 9/4 9/5 9/6 ・ ・ ・
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
検証してないんですが・・DISTINCTを使えば簡単なんじゃないですかね? select distinct C.日付,X.キー from ( select 日付,キー from B union select 日付+1,キー from A ) X,C where C.日付>=X.日付 and C.日付<=trunc(sysdate,'DD') ;
- jamshid6
- ベストアンサー率88% (591/669)
今回のご説明はよくわかりました(と思います)。 日付(DT)はDATE型、取込日はSYSDATEで書きましたが、考え方ご理解しやすい書き方のはずです。 1)「テーブルAにある最大の日付の翌日」と、「テーブルBにある最小の日付」のうち、小さい方がデータを作らないといけない開始日になります。取込日が終了日です(もちろんキー単位)。 2)それを割り出したら、テーブルCとBETWEENを使って結合します。 SELECT c.DT, d.KEY FROM tblc c INNER JOIN (SELECT KEY,MIN(DT) DTF,TRUNC(SYSDATE) DTT FROM (SELECT KEY,MAX(DT)+1 DT FROM tbla GROUP BY KEY UNION ALL SELECT KEY,MIN(DT) DT FROM tblb GROUP BY KEY) GROUP BY KEY) d ON c.DT BETWEEN d.DTF AND d.DTT ORDER BY c.DT,d.KEY
- jamshid6
- ベストアンサー率88% (591/669)
普通ならば一発で回答がつくような内容ですが、こういう場合はテーブルA、Bの日付は何を示すかは最低書いていただきたいです。 例が間違っていない限り、テーブルA/Bは開始日・終了日テーブルではないようです。 それを回答者に推測させる時点であまり親切な質問の仕方ではないですし、定義確認に最低1往復掛かって回答がすぐに得られないし、 回答も的外れになる可能性が高く、お互いメリットがありませんよね。
補足
言葉足らずな質問となってしまい、大変申し訳ありません。 テーブルAは蓄積用テーブルとして扱っており、データはテーブルBからテーブルAへINSERTされ、 日付はテーブルBから、テーブルAにINSERTされた日を表しています。 テーブルBは一定期間データを貯めて、あるタイミングでテーブルAへデータをINSERTします。 テーブルBの日付は、純粋にテーブルBへINSERTされた日付です。 テーブルCは日付マスタで、日付を連番で格納しています。 尚、テーブルBからテーブルAへデータをINSERTする際には、キー毎の日付をINSERTする日まで連番で持たせる必要があります。 #例として挙げさせて頂いたSELECTのイメージで、やりたい事をパターン別にわけるとすると、以下の3パターンとなります。 ※テーブルBからテーブルAへのデータ投入は9/4と仮定しています。 1.キー'AAAAA'のパターン:テーブルAにキーが存在し、テーブルAとテーブルBの日付が連番となっているので、 キーはそのままで、9/4までの連番データを作成したい。 2.キー'BBBBB'のパターン:テーブルAにキーが存在しないので、テーブルBの日付を開始日として、 9/4までの日付連番データを作成したい。 3.キー'CCCCC'のパターン:テーブルAにキーは存在するが、テーブルAとテーブルBのキー毎の日付が連番となっていないので、 9/1~9/4までの日付連番データを作成したい。 つたない説明となってしまいましたが、どうぞ宜しくお願い致します。