• ベストアンサー

データベースの検索について

ORACLE8.0.5において 日付を管理するテーブル(Work)において <構成>  workday char(08) not null (key) work7day char(01) workym char(06) 上記の構成のテーブルにおいて 指定日付(例:20020125)から、5レコード目の データを抽出するときの、SQLの組み方を教えてください。 PLSQLを使用して、上記のDBをアクセスし、5レコード目 (レコードが持っている営業日)を抽出しようとしています。よろしくお願いします。

  • patak
  • お礼率20% (24/115)

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

  • ベストアンサー
  • takekan
  • ベストアンサー率42% (6/14)
回答No.2

自宅にOracleの環境がありませんので検証をしていませんが、私なりに考えたSQL文です。 SELECT MIN(sub_tbl.workday) FROM ( SELECT tbl.workday FROM ( SELECT workday FROM work WHERE workday <= '20020125' ORDER BY workday DESC ) tbl WHERE ROWNUM = 6 ) sub_tbl ; 一番内側のSELECT文で、「指定日付以前の営業日を降順に抽出」 二番目のSELECT文で、「指定日付から5日前まで(6営業日分)のデータを抽出」 外側(三番目)のSELECT文で「6営業日の中で最小の営業日を抽出」 質問の要件を満たしているかどうかわかりませんが、お役に立てれば幸いです。 では

patak
質問者

お礼

上記のやり方で、何とか情報を絞り込んで抽出することができました。今回の場合は、そのSQLをWeb画面に取り込んでそこから、情報のチェックをやることになるので、もう少し、SQL文の絞込みを考えなければならないです。 ありがとうございました。

その他の回答 (1)

  • sgh
  • ベストアンサー率61% (75/121)
回答No.1

CURSORを使えば良いかと思います。 途中までソースを書いたのですが、PL/SQLはしばらくやっていないので、UPする自信がなくなりました。 あと、ご存じとは思いますが、目的のキーでソートをかけるのをお忘れなく。 すいません。こんな回答でm(_ _)m

patak
質問者

お礼

やはり、カーソルになるのですか。いろいろ考えてみます。

関連するQ&A

  • BLOB型項目をSQLの検索条件に指定して検索したいのですが。

    BLOB型の項目を持つTableに対して、SQLのSELECT文でBLOB型項目がNull(未設定)のレコードを抽出したいと思っています。 どのようなSELECT文を組めば良いのでしょうか? 方法がわからず困っています。 御教授下さい。 DBはOracle8.1.6、 OSはWindowsサーバ2003です。よろしくお願いします。

  • 毎日DBのデータをCSVに抽出したい

    タスクスケジューラで定期的に「SQL」を発行させてデータをCSVファイルにはきだしたいと思っています。 対象のdbがOracle、DB2、MySQLです。 悩んでいることが2か所あります。 抽出条件のSQLはSQLファイルに書いて簡単に実現できるのですが、 ・毎日CSVを作るためファイル名に日付を入れたい ・抽出条件に特定の日付を入れたいのですが対象のテーブルでは日付を日付型でもっておらず文字列です 例:20110206 どのようにすればいいでしょうか? ひとつのSQLファイル内で実現は不可能でしょうか?

  • オラクルDBでの不一致の検索

    ORACLE8.0.5において A-DB  code char(10); updte char(14); B-DB code char(10); A-DBとB-DBにおいてcodeが不一致のデータの抽出をする場合、 select B-DB.code from A-DB,B-DB where A-DB.code <> B-DB.code and A-DB.updte >= '20020301000000' and A-DB.updte <= '20020331235959'; 上記のようなSQL文を作成し実行したが、A-DBのcodeに対してB-DBのcodeを全部検索し、B-DBの検索分がすべて不一致になってしまいました。 SQLの考え方がまちがっているのかわからないでいるので、アドバイスをお願いいたします。

  • ストアドプロシジャからデータベースリンクを使っての参照について

    OracleツールのJDeveloperを使って、PL/SQLでストアドプロシジャを作成しています。 (Oracleは9i) DBが2つありまして(DB-AとDB-Bとする)、 DB-Bから、データベースリンクを介してDB-Aのテーブルを参照しています。 (SELECT * FROM XXXXX.テーブル名@データベースリンク名) DB-Bに接続してSQL*PLUS上で上記SELECT文を実行すると正しく処理されるのですが 上記SELECT文が組み込まれているDB-B上のプロシジャをコンパイルすると、 「ORA-04052」が返ってきてしまいます。 エラーコードを調べると、 DB-A側のテーブルを参照できていないようで、 「KGLR.SQLが実行されていることを確認してください」とのことなのですが、 この「KGLR.SQL」とやらが何者かわかりません。 タチの悪いことに、上記の現象が出る端末と出ない端末があります。 みんな同じIDでログインしているので権限の問題ではないと思ってるのですが・・・ 「KGLR.SQL」は置いといて、このような事象に出くわしたことのある方、 推測でもなんらかの情報をお持ちの方がいらっしゃいましたらご教授ください。 よろしくお願い致します。

  • DBのレコードサイズの調査方法について

    現在DBのレコードのサイズを調査しています。 例えばあるDBに100テーブルあるとしてその中で レコードのサイズが一番大きいテーブル名とそのテーブルの レコードサイズがいくつなのかを調査しております。 SQL等でレコードサイズを抽出することは出来るのでしょうか。 それとも全テーブルの定義情報から割り出すしかないのでしょうか。 調査対象のDBはPostgresSQL(ver 7.4)になります。 すみませんが宜しくおねがいします。

  • oracle SQL

    以下のようなことを実現する方法についてお教え頂きたいです。 ■テーブル [XXXマスタ] ID char(8) 上記のテーブルにはIDという項目があるのですが、このテーブルで 使用していないIDのみをSQLで抽出できないかと考えております。 ただし、なるべくならワークテーブルのようなものは利用せずに 行いたいと思っております。 いい方法があれば教えていただきたいです。

  • ACCESSとORACLEで抽出結果が異なる

    いつもお世話になっております。 ACCESS2000を扱っております。 ACCESSのデータベースにODBCを接続してORACLEの テーブルをリンクテーブルとしてインポートします。 そして、ACCESSのテーブルとORACLEのテーブルを LEFT JOIN を行いクエリーを作成したのですが、 正しい結果が抽出できません。 ただし、ORACLEのテーブル構成・データと全く同一の ACCESSのテーブルを作成し、クエリーを作成したところ 正常に動作しております。 SQLは以下のような内容となっております。 sSQL = SELECT TBL_1.A, TBL_1.B, TBL_1.C FROM TBL_1 LEFT JOIN TBL_2 ON TBL_1.A = TBL_2.A AND TBL_1.B = TBL_2.B AND TBL_1.C = TBL_2.C WHERE TBL_2.A IS NULL AND TBL_2.B IS NULL AND TBL_2.C IS NULL TBL_1がORACLEより引っ張ってきたリンクテーブル、 TBL_2がACCESSに存在するテーブルになります。 以上のSQLで、TBL_2に存在なくTBL_1に存在するレコード、及びTBL_1とTBL_2でキー項目は同じだが 内容が異なるレコードを抽出できると考えているのですが、TBL_2に存在なくTBL_1に存在するレコードしか 抽出できません。 個人的には、処理する件数が多大であることが影響しているのかとも考えているのですが・・・。 (両テーブルともに約20万件レコード) クエリーを分割することで解決はしたのですが、 原因究明を求められておりまして大変困っています。 皆様の知恵を借りたいです。宜しくお願いいたします。

  • 最新レコードを抽出し外部結合する方法について

    お世話になります。 現在、最新レコードを抽出し外部結合するSQLを考えているのですが、実現できておりません。 実現できるSQLをご存知の方、いらっしゃいましたら情報を頂けますでしょうか。 # 私の使用しているのは、PostgreSQL8.3となります。 実現したい内容は、以下となります。  1.テーブルAから「名前」でグループ化して最新の「更新日付」のレコードを抽出。  2.1の結果とテーブルBを「名前」で結合。  3.テーブルAの「名前」、「点数」、「更新日付」とテーブルBの「判定」を抽出。    ⇒ただしテーブルAに情報がある場合は、テーブルBの判定結果を「0」にして出力。      テーブルA               テーブルB ----------------------------   -----------------------  名前| 点数| 更新日付       名前 | 判定  ----------------------------   ----------------------- AAA   98   2011/4/1        AAA   0  AAA   60   2011/4/3        BBB   1  BBB   70   2011/4/2        CCC   1  BBB   35   2011/4/4        DDD   1  DDD   98   2011/4/1        EEE   0  EEE   47   2011/4/5         FFF   0  GGG   80   2011/4/6        GGG   1    【出力結果】 ---------------------------------------------  名前 | 点数  | 更新日付 | 判定  --------------------------------------------- AAA    60     2011/4/3      0  BBB    35     2011/4/4     0(1⇒0に変更)  CCC   NULL     NULL       1  DDD    98     2011/4/1     0(1⇒0に変更)  EEE    47     2011/4/5      0  FFF    NULL     NULL       0  GGG    80     2011/4/6     0(1⇒0に変更) お手数お掛け致しますが、ご教示のほどよろしくお願い致します。

  • 複数データベースへの問い合わせ

    同一サーバーに(DB1,DB2,DB3)と複数のデータベースがあった場合(ユーザーは同じです)、SELECTの際に複数のDBに対しての問い合わせをすることはできるのでしょうか? それぞれのデータベースはテーブルも全く同じ構造で、 そこから特定のフィールドのレコードだけを引っ張り出して使いたいのですが、SQLをどのように書いていいのかがわかりません・・・ ヒントだけでもいただけると嬉しいです。よろしくお願いします。

  • データベースにあった効率なフィールドの書き方?

    MySQL4とMySQL5を使っています。 データベース不慣れで、言葉や考え方が間違っているかもしれませんが、 例えば以下のようなフィールドを持つテーブルがあり、 どちらがデータベースにとって効率良い(スピードやDBサイズ) のでしょうか? 例1)1レコード128バイト bigint position zyusyo char(120) 例2)1レコード256バイト bigint position zyusyo char(248) MySQLに限らず、他のDBもフィールドの定義仕方で効率が変わることは、あるのでしょうか? このようなことはDBチューニング?というものでしょうか? 語彙不足で申し訳ありません。

    • ベストアンサー
    • MySQL