- ベストアンサー
テーブルの項目が異なるテーブルの結合方法
こんばんは。 すみませんが、下記のように出力するSQLを教えて下さい。 [処理table]のstatusが「新規」のに該当する場合、[処理table]の内容を、 [処理table]のstatusが「新規」のに該当しない場合、[処理ログテーブル] の「日付」が現在日付に近い内容のみを出力する。 氏名 project名 status 日付 ------+----------+-------+------- 鈴木 softA 新規 大塚 softB 承認 08/20 大沢 softC 新規 を期待しています。 SQLの経験が少ない為、悩んでます。 「UNION ALL 」について調べて見ましたが、カラム数が異なるのでNGと判断 しました。 「それぞれの条件の結果を縦につなげて…」とイメージしてみたのですが、 それに相当する資料が見当たらず、悩んでいます。 tableの[処理ログtable]の「日付」を[処理table]の項目とすればよ いのですが、現在のDB設計がこのようになってしまっているので、改善できま せん。 補足もしますので、お忙しいところすみませんが、宜しくお願いします。 -説明- [顧客table](主キー:顧客ID) 顧客ID 氏名 ------+------- 020001 鈴木 020002 大塚 020003 大沢 [処理table](主キー:通番(自動発番)) 通番 顧客ID projectID status ----+-------+----------+----------- 0001 020001 0001 新規 0002 020003 0003 新規 0014 020002 0004 承認 [処理ログtable](主キー:通番(自動発番)) 通番 顧客ID projectID status 日付 ----+-------+----------+-------+------ 0032 020002 0004 修正 08/02 0033 020002 0004 修正 08/15 0034 020002 0004 承認 08/20 [projecttable](主キー:projectID) projectID project名 ---------+---------------- 0001 softA 0002 softB 0003 softC 0004 softF
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは、 > カラム数が異なるのでNGと判断しました。 status が「新規」の場合、NULL を日付として返してやれば、 UNION ALL でOk ですょ。
その他の回答 (1)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
"union"も"union all"も、カラム数、カラム属性が同じ結果セットしか 統合できません。なので、#1で書かれているように、加工するなりして 属性とカラム数を合わせて下さい。 ただ、今回のSQLでは、unionやunion allは、特に必要ないように思います。 (unionを使った解決法も無くもないけど・・) select B.氏名, C.PROJECT名, A.STATUS, (select max(日付) from 処理ログTABLE X where A.STATUS='承認' and X.日付<=SYSDATE) 日付 from 処理TABLE A,顧客TABLE B,PROJECTTABLE C where A.顧客ID=B.顧客ID and A.PROJECTID=C.PROJECTID ; とかで、良いんじゃないですかね。(未検証ですが)
お礼
返事が遅くなりすみません。 UNIONを使わない方法もあるのですね!! SQLの経験が少ない為、とても参考になりました。 しかし、今回は、#1さんのを採用しました。 次の機会に盛込んで見たいと思います。
お礼
こんにちは。 早々の回答有難うございます。 >status が「新規」の場合、NULL を日付として返してやれば、 >UNION ALL でOk ですょ。 なるほど。 その後、やっとの思いでOracleに携わっているひとを見つけて話をしてみたら、「カラムをあわせればできる」とアドバイスしてもらいました。 詳細は、muyoshidさんと同じ回答でした。 muyoshidさんの回答を元に、また試行錯誤してみます。 有難うございました。