SQLでの前検索・後検索

このQ&Aのポイント
  • SQL初心者のため、SQLでの前検索・後検索について教えてください。
  • 使用するデータベースはMSSQL又はAccessです。
  • 前データが膨大に存在する場合、検索時間が長くなる問題についても解決方法を教えてください。
回答を見る
  • ベストアンサー

SQLでの前検索・後検索

はじめまして。 SQL初心者です。宜しくお願いします。 使用DBはMSSQL又は、Accessです(テスト中) まず、下のようなテーブルがあります。 (テーブル名 Tabel1) (フィールドは全てstring型) [ Date ][ No ][Data1][Data2] ... [20040808][0001][ 1 ][ 2 ] ... [20040808][0002][ 2 ][ 3 ] ... [20040809][0001][ 3 ][ 4 ] ... 検索キーは[Date]と[No]を使用しています。 そして、例えば、[20040809][0001]を検索し、そのデータの一つ前のデータを取得したい場合、次のようなSQLを使用しました。 SELECT TOP 1 * FROM Table1 WHERE DATE + NO < '200408090001' ORDER BY DATE + NO DESC しかし、この検索は、前データが膨大に存在した場合に(テストでは数万件)、検索時間がかなり長くなるようでした。 もっと良いSQLコマンド、または対処法がありましたら御教授の程宜しくお願い致します。

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

  • ベストアンサー
  • grace2973
  • ベストアンサー率66% (16/24)
回答No.1

DateとNoで、一意にデータが抽出できる (DateとNoを指定すれば1レコードだけになる) として select * from Table1 where Date + No = (select MAX(Date + No) from Table1 where Date + No < '200408090001') でいかがでしょうか?

mashlarc
質問者

お礼

graceさん返答有難う御座います。 なるほど! まず、Date + No のフィールドで絞り込んでから目的のデータを取り出すんですね。 勉強になります。 間違いなく検索スピードが上がりました。有難う御座いました。

関連するQ&A

  • sqlについて

    SQLについて質問です。 VBからMDBにSQLでデータの参照をしたいのですが ("select * from abc where No = " & No & " ;") テーブル内の数ある項目の中で一つだけまたは複数除いて参照する場合のSQL文を教えてください。 項目が60個ほどありますので一つ一つ指定していくとすごく長いSQLになってしまいそうですのでお知恵をお貸しください><

  • 異なるmdbファイルにテーブルをSQLでコピー

    SELECT * into table1 from tabel2 のようにして、同じmdbの中でテーブルをコピーすることはできますが、 異なるmdbファイルにテーブルをSQLを使ってコピーすることはできるものですか。 #できないという回答もお待ちします。 #access2000

  • SQL

    テーブル仕様は下記のようになっているときに、 mailアドレスには重複したデータが含まれる場合に 全てのデータを取得したいのですが、携帯の重複したデータを省きたいです。 サブクエリーを使って表現しようと思うのですが、どうもうまくいかず。。 numはシーケンシャルナンバーなので、かぶることはないのですが、 何かいい方法はないでしょうか?? 下記のように考えたのですが、どうもうまくいかず。。。 num | id | mail | event | date 1 | 121 | xxxxx@xxx.com | test | 2005-10-11 select * from test_table where 1=1 and event = 'test' and num in(サブクエリー) order by RANDOM() desc limit 3

  • REGEXPを使った検索文をスマートにできますか

    初心者ではございますが、質問失礼いたします。 下記のようなSQL文を使っています。 例文: SELECT table1.no, table1.titile, table1.date FROM table1 WHERE ( table1.title REGEXP "りんご" || table1.title REGEXP "みかん" || table1.title REGEXP "ばなな" || ......... AND date > '2013-11-11' ORDER BY table1.date DESC table1.titleから、各単語を含むタイトルを全て表示させるもので、 検索する単語は無制限に増える予定です。 現在の文でも結果など特に問題ないのですが、 コードが長くてこれでいいものかと思い探したところ特になかったため、 良い方法をご存知の方がいらっしゃったら・・・という望みで 質問の方させていただきました。 お時間のある際にでもお教えいただければと思います。 もし、上記に変わる表現がない場合は、無いとお教えいただければ助かります。 何卒宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • 4つのテーブルから、該当する項目を一度に検索したい。重複除く

    4つのテーブルから、それぞれ違う条件で検索し、該当する項目名NO を探したいのですが、どのようなselect文を書くと効率よく検索できる のでしょうか?また、重複NOは除きたいのです。 良かったら教えて下さい。 例えば、テーブル名:test1,test2,test3,test4とあった場合、 一度に該当するNOを拾い出す方法があれば、教えて下さい。 1.select no from test1 where code = '' and day < 20041118; 2.select no from test2 where day < 20041118; 3.2.select no from test3 where data != '' and day < 20041118; 4.select no from test4 where day > 20041018 and day < 20041118;

  • 同じSQL文での検索結果が異なる

    visualbasic2005とoracleを使ってデータベース管理ソフトを作っています。 ひとつのデータのフィールドはいくつかあるのですが、 DATAUPLOADというフィールド値をSQL文で検索するときのみ、 土曜日のデータを拾おうとするとなぜか検索をかけるごとに 件数が1件ずつ減っていくという現象が起きています。 他のフィールドや土曜日以外のフィールドの検索の時には そのようなエラーは起こらないのですが、 同じSQL文で検索結果が随時異なってしまう場合には どのような原因が考えられますでしょうか? DATAUPLOAD は'2008/03/12 00:00:00'の形式のDate型データです。 あるDATE(日付)のデータを検索するときに使用しているSQL文は、 SELECT * FROM DATABASE WHERE DATEUPLOAD BETWEEN TO_DATE(' & CStr(Format(DATE, "yyyy/MM/dd")) & 00:00:00','yyyy/MM/dd hh24:mi:ss') AND TO_DATE(' CStr(Format(DATE, "yyyy/MM/dd")) & 23:59:59','yyyy/MM/dd hh24:mi:ss') です。 いろいろとSQL文を変更してみたのですが、 同じエラーが続いています。 何か思い当たることがありましたら 教えていただければと思います。

  • SQLの検索条件について教えてください

    PL/SQLを使い始めた初心者です。 Oracleのバージョンは9iです。 検索時の条件の設定について教えてください。 例えば、2つテーブルがあるとします。 Aテーブル.TESTNoA ------------- 11111 22222 33333 44444 55555 Bテーブル.TESTNoB ------------- 11111 33333 55555 SQL発行時、 WHERE A.TESTNoA = B.TESTNoB で3件のレコードが取得できますよね。 これと同じ結果が欲しいのですが、 検索条件にテーブル型の変数(索引付表?)は使用できるのでしょうか? 変数 TestHen(0) = 11111 TestHen(1) = 33333 TestHen(2) = 55555 こんな感じで設定しておいて、この変数を利用して 一度のSQLで結果を取得したいのです。 できればLIKEを使って検索したいのですが…。 書き方がおかしかったらすみません。 どなたかお知恵をお貸しください。

  • SQL:TIMESTAMPの期間検索を指定するには?

    教えてください。 SQL文で日付期間の検索をしたいです。 フィールド名:tran_dataの値が、 2004/09/01 ~ 2004/09/03 のデータを検索したい。 データはTIMESTAMPで取得されています。 テーブル名:dat_history 【失敗例】 select * from web.dat_history where tran_date = '2004-08-18' 【エラーメッセージ】 日付値のストリング表記が間違っています。

  • PHPでSQLの中にSQLという記述はできますか?

    PHPでログイン画面で入力されたIDからユーザーNOを割り出し、商品テーブルにあるユーザーNOが一致する商品だけを絞り出すSQLを組みたいです。 ユーザーテーブル ユーザーNO、ユーザーID、パスワード 商品テーブル 商品名、ユーザーNO、数量 商品テーブルのsqlのwhereの中に、もうひとつsplをいれるようなことできますか? 例えばユーザーIDがyamadaの検索結果でたユーザーnoで商品テーブルのユーザーnoが一致するものを表示です よろしくお願いします

    • ベストアンサー
    • MySQL
  • updateしてもSQLを終了すると元に戻る

    Oracle_9→access2002 で外注開発されたシステムを利用しています さて、Oracle、SQL_Plusの[update TABLE1 SET FIELD1 = 'X' WHERE FIELD1 IS NULL]等でデータ更新後、[select 列名リスト FROM TABLE1 WHERE 検索条件]で確認すると確かに更新されているが、SQLを終了後、再起動すると元に戻ってしまいますが、どんな原因が考えられますか?update実行後に確定操作等あるのですか? Oracleはまったく初心者ですがお願いします