• ベストアンサー

PL/SQLについての質問です

ビューを作成しているのですが、1つ分らないことがあり困っています。 SYSDATEに一番近い日付のレコードを抽出したいのですがどうすればいいのか分りませんどなたか知恵を貸していただけないでしょうか。よろしくお願い致します。

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

  • ベストアンサー
  • iwaz
  • ベストアンサー率57% (8/14)
回答No.4

こんにちは。 先の内容から作成するとこんな感じでしょうか。 (確認している間が無かったので動作するかはわかりません。 B.ID || B.来店日 項目が文字型でなければTO_CAHRで文字列 変換してやる必要があるかもしれません。) SELECT A.ID, A.CUSTNAME, A.SEX, A.PHONENO, B.来店日, B.担当, B.注文 FROM tab01 A, tab02 B WHERE A.ID = B.ID AND B.ID || B.来店日 IN (SELECT ID || Max(来店日) FROM tab02 WHERE 来店日 <= TO_DATE(SYSDATE,'YYYY/MM/DD') GROUP BY ID);

saruno
質問者

お礼

どうもありがとうございました。 望みどおりのビューを作成することができました。 感謝!感謝!です。

その他の回答 (3)

  • yuji
  • ベストアンサー率37% (64/169)
回答No.3

Oralceはバージョンによって使用できるSQL文が 微妙に違います。 質問する際に、少なくとも  Oracleのバージョン  OS 程度は明らかにしてください。

saruno
質問者

補足

バージョンはオラクル8i 8.1.6です。 OSはwin2000です。

  • iwaz
  • ベストアンサー率57% (8/14)
回答No.2

とりあえず作ってみましたという感じです。 (実際使用するテーブル件数がやたら多い場合は やめといたほうがいいかも知れません。) 当日を含む過去日付で一番直近なものをとってきます。 DBはORACLEでサンプルでついている EMP表で 作成してみました。 参考になるでしょうか? SELECT EMPNO, ENAME,JOB, HIREDATE FROM EMP WHERE HIREDATE = (SELECT MAX(HIREDATE) FROM EMP WHERE HIREDATE IN (SELECT MAX(HIREDATE) FROM EMP WHERE HIREDATE >= TO_DATE(SYSDATE,'YYYY/MM/DD') GROUP BY HIREDATE));

saruno
質問者

補足

どうもありがとうございます。 SQLは結構複雑に組むことができるんですね。 もう少し突っ込んだ質問をしてよろしいでしょうか。 tab01 CUSTID CUSTNAME SEX  PHONENO   01   鈴木    男   0311112222  02   田村    男   0322223333 tab02 CUSTID   来店日   担当者  商品 01     2001/12/10  佐藤   ラーメン  01     2001/12/15 斎藤   カレー 02     2001/12/08 原田   唐揚げ   02     2001/12/14 峰    ハンバーグ  これらの2つのテーブルから下のようなビューを作りたいと考えています。 VIEW CUSTID CUSTNAME SEX PHONENO 来店日   担当者 01      鈴木    男   0311112222  2001/12/15     佐藤 02      田村    男   0322223333  2001/12/14    峰  tab2のなかで同一のIDを持っているレコードの中から一番SYSDATEに近いレコードを 抽出したいのです。いろいろやっているのですが、どうしてもテーブルの中で一番SYSDATEに近いレコードを持ってきてしまいます。 ひき続き格闘しておりますので、お時間がありましたらアドバイスください。お願い致します。

  • MarrowG
  • ベストアンサー率53% (41/76)
回答No.1

SELECT * FROM table WHERE date-field <= SYSDATE HAVING MAX(date-field) って感じで出来ると思いますが…。 SYSDATEより新しい日付のデータが無いという前提ですが。 #未来の日付が入っているとは思えないので。

saruno
質問者

補足

ご解答ありがとうございます。 上の構文を試してみましたか、エラーになってしまいました。 せっかく教えていただいたのにこんなこといってすみません(汗)。 僕もいろいろ調べてみます。

関連するQ&A

  • PL/SQLについて

    以下のVIEWをPROCEDURE内で使用しています。 CREATE OR REPLACE VIEW VW_KAIIN (CODE,NAME,TEL,STARTYMD) AS SELECT * FROM KAIIN WHERE STARTYMD <= TO_CHAR(SYSDATE,'YYYYMMDD') ※STARTYMDには有効な開始日付が入ります。 条件部分でSYSDATEではまずいことになり、 特定の日付を指定しなければならなくなりました。 VIEW自体にパラメータ渡しはできないということで、 CREATE OR REPLACE PROCEDURE TABLE_B_UPDATE (I_YYYY IN TABLE_A.YYYYY%TYPE, I_MM IN TABLE_A.MM%TYPE, I_DD IN TABLE_A.DD%TYPE,) PROCEDURE内でI_YYYY、I_MM、I_DDを条件に変更した VIEWを動的に作成して、処理をしたいのですが、 こういった事は可能でしょうか? そのまま書いてみましたが、CREATE部分でエラーが出てしまい、コンパイルできませんでした。 もし不可能である場合は、代替案をご教授いただけるとありがたいです。 どうかよろしくお願いします。

  • ビュー(view)のSQL

    SQL初心者で困っております。 どのようなSQLを作成すれば良いか ご助言頂ける方がいらっしゃいましたら よろしくお願いいたします。 テーブルにイメージは以下通りです。 項目1,日付,月,項目2,項目3 1234 ,6/2 ,6 ,A ,1 1234 ,6/4 ,6 ,A ,2 1234 ,6/5 ,6 ,A ,3 1234 ,6/6 ,6 ,B ,1 1234 ,6/6 ,6 ,B ,2 1234 ,6/6 ,6 ,B ,3 1234 ,7/2 ,7 ,A ,1 1234 ,7/4 ,7 ,A ,2 主キーは、項目1,日付です。 ビューで項目1,月をグループ化して、 項目2の昇順のトップ その中で項目3の昇順のトップ のレコードを抽出したいと思います。 結果が以下のようなイメージです。 1234,6,A,1 1234,7,A,1

  • SQLの書き方について

    (1)の様なテーブルから結果を(2)の様にしたいのですが どのようなSQLを書いたら表示できるのかわかりません。 アドバイスなどをお願い致します。 (新たにView等を作成するなどでもかまいません。) (1)dept_id / item_id / day / time (カラム) 1111 / 0001 / 20090101 / 60 (レコード1) 1111 / 0001 / 20090102 / 30 (レコード2) 1111 / 0002 / 20090101 / 40 (レコード3) 1112 / 0001 / 20090101 / 30 (レコード4) (2)dept_id / item_id / time1 / time2 1111 / 0001 / 60 / 30 1111 / 0002 / 40 / 1112 / 0001 / 30 /

  • SQLで、指定日条件のSQL文

    MySQLを使っています。 商品テーブルの中で、 同じ商品のレコードが複数あります。 その多数のレコード中に、日付項目があります。 そこから、 1)商品IDで重複せずに、2)指定日に、3)一番近い過去の日、4)指定日を含めて、複数ある未来の全レコード、を抽出するには、 どのようなSQL文を書けばよいでしょうか? 商品でユニークになるように、 1.過去に複数ある日付の中から、指定日に、一番近いレコード。 2.未来に複数ある日付の中の、全ての未来の、レコード。 3.同一商品レコードは、複数抽出されない。

  • SQLで、過去で一番大きい日付のレコード抽出

    MySQLを使っています。 同じ商品のレコードが複数あります。 その多数のレコード中に、日付項目があります。そこから、 1)指定日に、2)一番近い過去の日の1件の、3)全商品のレコード、を抽出するには、 どのようなSQL文を書けばよいでしょうか? 1.過去に複数ある日付の中から、指定日に、一番近いレコード。 レコードの例) 指定日=2015-07-01 商品ID 日付 1 2015-10-11 ・・・未来 ⇒ 抽出せず 1 2015-08-02 ・・・未来 ⇒ 抽出せず 1 2015-07-01 ・・・指定日 ⇒ 抽出せず 1 2015-07-01 ・・・指定日 ⇒ 抽出せず 1 2014-01-01 ・・・過去 ⇒ 抽出せず 1 2015-06-03 ・・・過去 ⇒ 抽出したい★★ 2 2015-10-11 ・・・未来 ⇒ 抽出せず 2 2015-08-02 ・・・未来 ⇒ 抽出せず 2 2015-07-01 ・・・指定日 ⇒ 抽出せず 2 2014-01-01 ・・・過去 ⇒ 抽出せず 2 2015-06-03 ・・・過去 ⇒ 抽出したい ★★

    • ベストアンサー
    • MySQL
  • PL/SQL内の検索条件について

    現在PL/SQL内にてSELECTを発行しています。 環境はoracle 11g、WinServer2008です。 SQLは下記になります。 SELECT * FROM TABLE_VIEW TV1 WHERE DAY_F <= kijun_dt AND DAYT >= kijun_dt ; kijun_dtは変数で渡しています。 質問は、kijun_dtを変数で渡すと処理が5秒くらいかかってしまうのですが '2012/03/01'のように固定すると一瞬で返ってきます。 型は日付型できちんとわたっており、 他のテーブル(view)でも同じように変数で渡している箇所が あるのですが、結果は一瞬え返ってきます。 統計情報の更新、マテリアライズド・ビューを作成し使用などしてみましたが どうしても遅くなる原因が特定できません。 似たような現象になった、または何か情報をお持ちの方、 ご回答を宜しくお願い致します。 足りない情報等御座いましたら書ける範囲で出しますので よろしくおねがいします。

  • PL/SQLの初歩的な質問その2

    失礼します。 先日は似たような質問でお世話になりました。 またPL/SQLについての質問です。 あるTBLに、以下のような感じでレコードが入っていたとします。 TESTtable test1(PK)(NUMVER型) test2(NUMVER型) --------------------------------------- 1 10 2 11 3 12 4 10 ここで以下のSELECT文を実行 SELECT test1 , test2 FROM TESTtable WHERE test2 = IN(10,12) この時、test2が10だったら20の数値に変換後test2として抽出し、 test2が12だったら22の数値に変換後test2として抽出する為には どのようなSELECT文になるでしょうか? 宜しくお願いします。

  • 一つの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 どうかよろしくお願いします。

  • PL/SQLでエラー

    PL/SQLの使用方法を検討しており、下記のようにサンプルを作成しました。 //1. 宣言部 create or replace package Pac is procedure Pro1(p1 in varchar2); end; / パッケージが作成されました //2. 本体 create or replace package body Pac is procedure Pro1(p1 in varchar2) is tempdate DATE; begin select to_char(sysdate, 'yyyy/mm/dd') INTO tempdate from dual; DBMS_OUTPUT.PUT_LINE('引数は' || p1 || 'です。'); DBMS_OUTPUT.PUT_LINE('日付は' || tempdate || 'です。'); end; end; / パッケージ本体が作成されました //3. 実行 execute Pac.Pro1('a'); // エラー内容 行1でエラーが発生しました。: ORA-00900: invalid SQL statement SQLPlusより、上記の[1. 宣言部]でパッケージを作成し、[2. 本体]で本体部分を作成しました。 その後、[3. 実行]を実施しましたが、 エラーが出力されて実行されません。 何がいけないのかお気づきの点がございましたら、 よろしくお願いします。

  • SQLで、指定日に日付条件で抽出方法

    商品テーブルの中で、 同じ商品のレコードが複数あります。 その多数のレコード中に、日付項目があります。 そこから、 1)指定日に、2)一番近い過去の日の1件、3)指定日を含めて、複数ある指定日及び未来の全レコード、を抽出するには、 どのようなSQL文を書けばよいでしょうか? 1.過去に複数ある日付の中から、指定日に、一番近いレコード。 2.指定日と未来に複数ある日付の中の、全ての未来の、レコード。 レコードの例) 指定日=2015-07-01 商品ID 日付 1  2015-10-11 ・・・未来 ⇒ 抽出したい 1  2015-08-02 ・・・未来 ⇒ 抽出したい 1  2015-07-01 ・・・指定日 ⇒ 抽出したい 1  2015-07-01 ・・・指定日 ⇒ 抽出したい 1  2014-01-01 ・・・過去 ⇒ 抽出しない★ 1  2015-06-03 ・・・過去 ⇒ 抽出したい 2  2015-10-11 ・・・未来 ⇒ 抽出したい 2  2015-08-02 ・・・未来 ⇒ 抽出したい 2  2015-07-01 ・・・指定日 ⇒ 抽出したい 2  2015-07-01 ・・・指定日 ⇒ 抽出したい 2  2014-01-01 ・・・過去 ⇒ 抽出しない★ 2  2015-06-03 ・・・過去 ⇒ 抽出したい

    • ベストアンサー
    • MySQL