• ベストアンサー

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' )

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

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.1

単純に、副問い合わせを二つ作って、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)
回答No.2

取得する項目は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