- ベストアンサー
SQL 副問い合わせ
以下のaテーブルのcardidと、bテーブルのnoが同じで、 かつ、bテーブルのryodtmが前月のデータを抽出する以下のsqlを、 aテーブルのcardidが、bテーブルのnoと同じで、かつ、ryodtmが前月分、 または、cテーブルのchangcardと同じで、かつ、ryodtmが前月分のを抽出する場合、 どうすればいいでしょうか? select * from a where cardid in ( select distinct(no) from b where kdncresbt ='1' and ryodtm >= TO_CHAR(ADD_MONTHS(TRNC(SYSDATE,'MONTH'), -1),'YYYYMM' ) || '01' and ryodtm < TO_CHAR(SYSDATE,'YYYYMM') || '01' )
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
単純に、副問い合わせを二つ作って、orで結合すればいいんじゃないかなと思いますけど。つまり select * from a where cardid in (select no from b where cardid in kdncresbt ='1' and trunc(ryodtm,"MM") = trunc(trunc(sysdate,"MM")-1,"MM") ) or cardid in (select changcard from c where trunc(ryodtm,"MM") = trunc(trunc(sysdate,"MM")-1,"MM") ) となるでしょうか。 ちなみに、先月という条件は、少し書き直しました。 trunc(ryodtm,"MM")は、ryodtmの月の1日を返します。 これと、先月の1日を=で比較するカタチにしています。trunc(sysdate,"MM")は今月の1日。これから1を引くと、先月の月末ですから、この結果を月で切り捨てて1日にしています。 副問い合わせの二つのselectをunionで結合して一つのテーブルのカタチにすると、inは一回ですむかもしれません。 結果の検証を実機でしていないので、バグがあるかもしれませんが・・・
その他の回答 (1)
- davosuke
- ベストアンサー率61% (34/55)
取得する項目はaテーブルのすべての項目と仮定したら(質問より) select a.* from a, ( select no As no from b where substr(ryodtm,1,6) = TO_CHAR(ADD_MONTHS(SYSDATE,'MONTH'), -1),'YYYYMM') ) tmp_b, -- bの抽出条件 ( select changcard As no rom c where substr(ryodtm,1,6) = TO_CHAR(ADD_MONTHS(SYSDATE,'MONTH'), -1),'YYYYMM') ) temp_c -- cの抽出条件 where temp_b.no = a.no OR temp_c.no = a.no