• ベストアンサー

テーブルの項目が異なるテーブルの結合方法

こんばんは。 すみませんが、下記のように出力する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

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

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちは、 > カラム数が異なるのでNGと判断しました。 status が「新規」の場合、NULL を日付として返してやれば、 UNION ALL でOk ですょ。

asaichi
質問者

お礼

こんにちは。 早々の回答有難うございます。 >status が「新規」の場合、NULL を日付として返してやれば、 >UNION ALL でOk ですょ。 なるほど。 その後、やっとの思いでOracleに携わっているひとを見つけて話をしてみたら、「カラムをあわせればできる」とアドバイスしてもらいました。 詳細は、muyoshidさんと同じ回答でした。 muyoshidさんの回答を元に、また試行錯誤してみます。 有難うございました。

その他の回答 (1)

回答No.2

"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 ; とかで、良いんじゃないですかね。(未検証ですが)

asaichi
質問者

お礼

返事が遅くなりすみません。 UNIONを使わない方法もあるのですね!! SQLの経験が少ない為、とても参考になりました。 しかし、今回は、#1さんのを採用しました。 次の機会に盛込んで見たいと思います。

関連するQ&A