• ベストアンサー
  • すぐに回答を!

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
  • 閲覧数288
  • ありがとう数1

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

  • ベストアンサー
  • 回答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は一回ですむかもしれません。  結果の検証を実機でしていないので、バグがあるかもしれませんが・・・

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • Oracle SQL DELETE文のレスポンス

    いつもお世話になっております。 この度は、手前のSQL文において DELETE文のレスポンスが上がらずに難儀しています。 現在DELETE処理はバッチにて行っています。 最初にSELECTにて抽出を行ったものをバックアップにとり、 次は同様の条件でDELETE文で処理しています。 この際に、SELECTでは1秒程度で済んだ処理が、 DELETE文ではレスポンスが返ってこないという状況です。 何がまずいのか、どう工夫すればいいのか 色々変えてみましたがレスポンスは改善されません。 SQLと条件は以下です。 【SQL文】 SELECT 複数の項目 FROM TABLEA A WHERE NOT Exists(SELECT 'X' FROM TABLEB B WHERE A.ITEMNO = B.ITEMNO) AND NOT Exists(SELECT 'X' FROM TABLEC C WHERE A.ITEMNO = C.ITEMNO AND to_char(LAST_DAY(ADD_MONTHS(SYSDATE,-4)),'YYYYMMDD') < C.REPYMD) AND NOT Exists (SELECT 'X' FROM TABLEA2 A2 WHERE A.ITEMNO = A2.ITEMNO AND to_char(LAST_DAY(ADD_MONTHS(SYSDATE,-4)),'YYYYMMDD') < to_char(A2.CREATEDATE,'YYYYMMDD')) AND NOT Exists(SELECT 'X' FROM TABLEC C WHERE A.ITEMNO != C.ITEMNO AND to_char(LAST_DAY(ADD_MONTHS(SYSDATE,-4)),'YYYYMMDD') < to_char(A.CREATEDATE,'YYYYMMDD')) 上記のSELECT文の後に処理されるDELETE文は 「SELECT 複数の項目 FROM TABLEA A」 ⇒ DELETE FROM TABLEA A としたもので、 条件は全てSELECT文と同様のものを使用しています。 ◆条件を言葉で明記すると以下のようになります。 1.Bテーブルに存在するものは削除対象外とする 2.AテーブルのアイテムIDとCテーブルのアイテムIDは一致する。   AテーブルのCREATEDATEとCテーブルのREPYMDのいずれかが3ヶ月以内のアイテムは   削除対象外とする 3.AテーブルもしくはCテーブルにしか存在しない場合は、各日付が3ヶ月以内のアイテムは   削除対象外とする 以上のようになっています。 どなたかアドバイスをいただければ幸いです。 宜しくお願い致します。

  • WHERE句でのデータ型について

    お願い致します。 ORACLEのWHERE句に対する疑問点ですが、 カレンダを管理するテーブル(カレンダマスタ)において、条件を指定してデータをSELECTする時にWHERE句に記入するデータ型についてご指導お願いします。 <詳細> 目的としてカレンダマスタよりSYSDATEの年月の休みの日を除く、稼動日数(COUNT)を求めるのが、目的です。 自分で作成した、SQLでは目的を果たしているのですが、WHERE句にTO_CHARを使用し、抽出項目(年月日-DATE型)を指定しているのですが、条件を指定する時は、TO_CHARで指定しても問題は無いのでしょうか? <SQL> SELECT COUNT(TO_NUMBER(休みFLG)) AS 稼動日 FROM カレンダマスタ WHERE 年月日 BETWEEN (TO_DATE(LAST_DAY(ADD_MONTHS(SYSDATE,-1))+1,'YYYY/MM/DD')) AND (TO_CHAR(LAST_DAY(SYSDATE),'YYYY/MM/DD')) AND 休みFLG='0' <補足> 休みFLG='0'は稼動日

  • オラクルSQLについて

    初心者です。困っています。 テーブルC 日付_番号_ステータス 1/3____1_____Q 1/5____2_____R 1/6____5_____G 1/7____7_____P 1/20__ 9_____R 2/1___10_____R このようなテーブルを、1.日付順、2.番号順の優先順位で、選択していく為、下記のようなSQLを作成しました。 SELECT 番号 FROM テーブルC WHERE (TO_CHAR([日付],'yyyyMMdd') || [番号]) IN (select MIN((TO_CHAR([日付],'yyyyMMdd') || [番号])) FROM テーブルC WHERE (TO_CHAR([日付],'yyyyMMdd') || [番号]) > (SELECT (TO_CHAR([日付],'yyyyMMdd') || [番号]) FROM テーブルC WHERE [番号]=前回編集した番号)) ユニークなのは番号だけです。 これに、ステータス が RかPの場合 を加えたいだけなのですが、SQLが多くなりすぎて、困難になってしまいました・・・。 どなたかご教授頂ければ幸いです。

その他の回答 (1)

  • 回答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

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • 時間の抽出条件

    業務で開発中、どうしてもわからなかったので質問させていただきます。 あるテーブルから「データを抽出する日の14時までにできたデータのみを抽出する」というSQLですが、 データを抽出する日→SYSDATEでYYYYMMDDまでを取得する考えです。 このあとの14:00:00という条件をつけるSQLの書き方がわかりません。 このような書き方ではだめでしょうか? SELECT * FROM T_TEST WHERE DATAYMD < TO_CHAR(SYSDATE '14:00:00','YYYYMMDD HH24:MI:SS'); DATAYMDはCHAR型で8バイトで入っています。 よろしくお願いいたします。

  • oracleのsqlで日付判断

    テーブルに以下の以下の様に日付が登録されています。、 cal_year cal_month cal_day item1 item2 item3 ・・・・・・ : 2019 6 29 2019 6 30 2019 7 1 2019 7 2 ; 2019 7 10 2019 7 11 ; 2019 7 20 2019 7 21 : 2019 7 31 2019 8 1 2019 8 2 : 見ての通り、テーブルに登録されている日付が、年、月、日と各々で 登録されており、また、月と日には、ゼロ埋めされてない値となって います。 因みに、cal_year、cal_month、cal_dayの属性は、varchar2です。 以下のsqlで、日付指定で、システム日付より以降の日付のデータを 取得しようとしているのですが、上手く行きません。 select * from tableA where cal_year||cal_month||cal_day>to_char(sysdate,'FMYYYYMMDD') order by cal_year,to_number(cal_month),to_number(cal_day) ; 今日、2019/7/22でやると、「2019 7 3」以降が出力されます。 また、日付を直接指定するとエラーとなります。 select * from tableA where cal_year||cal_month||cal_day>to_char('2019722','FMYYYYMMDD') order by cal_year,to_number(cal_month),to_number(cal_day) ; 「SQL : ORA-01481: 数値書式モデルが無効です」となります。 何がいけないのでしょうか。 このような使い方はダメなのでしょうか。 それとも、使わない使い方をしているのでしょうか。 お願いいたします。

  • SQLのBetween句

    SQL初心者です。 どなたかヒントでもよいのでご教授お願いします。 分からない箇所は以下の2つです。(SQLは下方に示しています) ・where句のbetweenの箇所にカラム指定箇所にTO_CHAR(SYSDATE -2, 'YYYYMMDD') を入れた時、何を評価しているのか? ・where句のbetweenの条件部分のカラム名に(+)をつけた場合何を意味しているのか? この2つがどうしても分かりません。 このSQLについて知識お持ちに方よろしくお願いします。 環境は次の通りです。 ------------------------ ■環境 ・OracleDatabase10.2 ■テーブル構成 テーブルは以下の2つです。 ・sample1 ・sample2 sample1テーブルに以下のカラムがあります。 ・test1 sample2テーブルに以下のカラムがあります。 ・test2 ------------------------ ■SQL SELECT * FROM sample1 s1, sample2 s2 WHERE TO_CHAR(SYSDATE -2, 'YYYYMMDD') BETWEEN s1.STAYMD(+) AND s2.(+)

  • SQLの処理速度改善にむけて

    処理速度改善に向けて、3つ質問があります。 解答は1つでも良いのでお願いします。 1.検索条件が複数ある場合、もっとも絞れる物から検索するのが早いのでしょうか?   (Indexはその順番に伴い変更する事を前提)   例: where X = 3 (1000件中10件に絞れる) and Y = 4 (1000件中100件に絞れる) and Z = 5 (1000件中900件に絞れる) 上記のように、より絞れる物から検索する。 2.文字列で検索する場合、以下は同じ結果でしょうか。そしてパターン2の方が早いでしょうか   ・パターン1   where X <> 'Z' ・パターン2   where X > 'Z' and X < 'Z' 3.条件式にTO_CHARが入った場合、indexカラムの場合、遅くなるでしょうか?   下記SQLを直すとした場合、どのように直せるでしょうか? SELECT * from X,Y where TO_CHAR(X.DATE,'YYYYMM') = Y.DATE2(+)

  • 一つのSQLにできませんか??

    表領域のサイズと使用量を抽出するSQLを作成しています。 上は自動拡張サイズと現サイズを抽出するSQL、下は現在の使用量を抽出するSQLです。この二つを一つのSQLで作成ってできないでしょうか?? (1)自動拡張と現サイズを算出 select sysdate syoribi, a.tablespace_name, to_char(sum(a.MAXBYTES)/1024/1024, '999,999,990') jidou, to_char(sum(a.BYTES)/1024/1024, '9,999,990.9') gensaize from dba_data_files a group by a.tablespace_name (2)使用量を算出 select sysdate syoribi, b.tablespace_name, to_char(sum(b.BYTES)/1024/1024, '9,999,990.9') siyoryo from dba_segments b group by b.tablespace_name どうかよろしくお願いします。

  • SQLの結合が理解できていません。教えてください。

    【テーブル:A】 A_Year A_Month A_Day A_No A_CNo --------------------------------- 2009 03 06 1111 01 2009 03 06 1111 02 2009 03 06 1112 01 .. 【テーブル:B】 (CNo1~99までの固定。CNameの中身が時々更新される。) CNo CName ----------- 01 Item1 02 Item2 03 Item3 .. 99 Item99 **************************************** AとBのテーブルから、 Aにある[2009/03/06]の[A_No=1111]に入っているA_Cnoを見て、 テーブルBの[CName]が取得したいのですが Select B.CName from A,B WHERE A.A_Year='2009' AND A.A_Month='03' AND A.A_Day='06' AND A.A_No='1111' AND A.A_CNo=B.CNo では該当のデータはDBにあるのですが、上手く取得できません。 BテーブルにあるCNameはAテーブルに項目を追加しないとダメなのでしょうか? すいませんがどなたかご教授ください。 環境: Oracle9i+ExcelVBA(ODBC)

  • インラインビューにおける他テーブルの別名参照ができない

    Oracle9iで開発をしています。 インラインビューを使ったSQLで行き詰ってしまいました。 抽出条件として会社テーブルの設立日が12ヶ月前からシステム日付まで、 その該当テーブルのID = 社員テーブルのIDとなる名称を取り出す。 上記に該当する社員テーブルの種類 = 商品テーブルの種類となる名称を取り出す。 となるようにSQLを考えると、 SELECT T1.NAME, T2.NAME FROM 会社テーブル C, (SELECT * FROM 社員テーブル E WHERE C.ID = E.ID) T1, (SELECT * FROM 商品テーブル A WHERE T1.KIND = A.KIND)T2, WHERE C.DATE BETWEEN add_month(sysdate,-12) AND sysdate のような感じになりまして、実行すると"C"."ID":無効な識別子ですと 表示されました。 インラインビューの中ではC、T1のように外部の別名を参照することは できないのでしょうか? できない場合の対策方法なども教えてください。

  • SQLについて

    こんにちは、honiyonです。  良い質問タイトルが思いつきませんでした...(^^;  2つのテーブルがあります。(仮定です)   ・オーナーの情報テーブル(owner)   ・オーナーの車の情報テーブル(car)  この2つのテーブルを利用して「男性の人で、黒い車に乗ってる人の車種名」を検索しようとしました。  これを1つのSQLで   SELECT car.name FROM owner,car WHERE (owner.no=car.ownerno) and (car.color='black') and (owner.sex='MAN');  とか、   SELECT car.name FROM (SELECT * FROM owner WHERE (owner.sex='MAN')) AS O2, (SELECT * FROM car WHERE (car.color='black')) AS C2 WHERE (owner.no=car.ownerno);  とかやってみましたが、涙が出るほど遅いです。  しかし   SELECT * INTO TABLE owner_tmp FROM (SELECT * FROM owner WHERE owner.sex='MAN'); SELECT * INTO TABLE car_tmp FROM (SELECT * FROM car WHERE car.color='black'); SELECT car_tmp.name FROM (owner_tmp.no=car_tmp.ownerno);  とすると超高速です。  なんとかテンポラリを作らず、出来れば1つのSQL文で高速に冒頭の処理を行いたいのですが、良い方法はないでしょうか。 是非お知恵を貸してください。  宜しくお願いします(.. #データベースはPostgreSQL 7.2.3です。

  • SQL 副問い合わせ EXSIST?

    いつもお世話になってます。独学で情報処理勉強しています。 【専門用語をなるべく使わずに】答えていただける方お願いします。 表が「社員表」と「社員有資格表」の二つしかなくて、 社員表    |社員番号|社員名|所属| 社員有資格表 |社員番号|資格名|登録日| 「資格を複数持つ社員を抽出するSQL」で SELECT DISTINCT 社員番号 FROM 社員有資格表 B1 WHERE EXSISTS (SELECT * FROM 社員有資格表 B2 WHERE B1.社員番号=B2.社員番号 AND B1.資格名<>B2資格名) のB1とかB2はなんですか。

  • SQL得意な方

    仕事で困っています、 なにとぞお力添えを。 テーブル1から、TOP50 でaとbを表示させたいのです。 で、その際の条件として、 開始するレコードも指定したいのです。 下記SQLの[○]の部分に50が入っていたら、 51~100件を表示する、と、いうような。 SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a で、順調だったのですが、WHERE条件が なんだか怪しいらしく、 a >= ''の時だけはきちんと動くのですが、 ANDでc='1'をつけた所、普通に全件表示されてしまいます。 [ちゃんと51件目から100件目を表示するSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a [何故か全件表示になるSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a ※[何故かNOT IN (~)の部分がまったく働いていない] どうしてなのでしょう?。 解りにくい質問で大変申し訳ないのですが どなたかご教授いただけないでしょうか。