• ベストアンサー

[ACCESS97]SQLの書き方

グラフのレコードソースにクエリ・SQLを使用しています。データ入力チェックに使おうと思っています。妙なデータがはいった場合、グラフが乱れるのではないかと。 ソートは日付でしています。 それで、100レコードずつを順番に表示していきたいのですが、top値 だと最初からいくつ、、としか指定できません。これを、レコードの途中の任意の位置から取るにはどうしたらいいのでしょうか? IDとかのようにユニークな値でソートしているのであれば、大小関係で一発ですが、同じ値がいくつも存在する日付なもので困っています。 日付でソートしたものを配列に入れる、もしくは一度テーブルに書き出す等も考えているのですが、SQLでできたら助かります。 よろしくお願いします。

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

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

No.1です。 >たとえば、もう一つ順序管理するフィールドを作って、 >そこに順序を書き込むようなアクションクエリは >簡単にできないものでしょうか? テーブル構造が同じの空のテーブルを作成しておくのはどうでしょうか? ただし、元のテーブルのフィールドの他に、オートナンバーのフィールドを1つ追加しておきます。 そして、このテーブルへ、日付昇順で追加クエリを実行すれば、日付昇順で、オートナンバーにユニークな整数が入ります。 ユニークなので、確実に私のSQLで100個ずつ取り出せます。 一連の操作が終了したら、テーブルの全データを削除します。 ただし、オートナンバーの値は、前回の続きからで、どんどん大きな値になります。 しかしそれも、テーブルのデータが空の状態で、Accessの最適化をすればまた「1」からナンバリングされます。

noname#27115
質問者

補足

実は、作業MDBがあっていくつかは必要時にtemp tableを作ってそこで作業しています。でも、やっぱり、ちょっとレスポンスが悪いかなぁと思って、SQLで一発でやる方法を今回は考えてみました。 でも、その方法が一番わかりやすそうなので、今回もそれでやろうと思います。 Access2000とかだと、もうちょっといい方法があるだろうと思うんですが・・・ どうもありがとうございました。

その他の回答 (4)

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

#4です・・・手持ちのAccess(XPですが)で実行してみましたが・・・  ほんとですね。  いくつか実験してみると、どうも、UPDATE文のSET句へのサブクエリーが許されていない模様です・・・(何か、jet特有の制限があるのかも・・・)  というわけで、#4のアクションクエリーはどうも実行できないようです。  失礼しました。

noname#27115
質問者

お礼

ご回答どうもありがとうございました。 今後ともよろしくお願いいたします。 m(__)m

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

 #2です。#3さんの回答で解決しているようですが、私への補足のアクションクエリーを書いておくことにします。  事前に、フィールドは準備されているものとして、そのフィールド名をjyuniとしておきます。 UPDATE tablea a SET jyuni =      (SELECT count(key1)+1 FROM tablea b       WHERE b.key1 < a.key1)  これで、jyuniにその時点での、各レコードの順位が入ると思います。  ちなみに、SQLの考え方は、前のSQLと同じです。

noname#27115
質問者

補足

こんにちは、ありがとうございます。 おっしゃっている内容は次のような感じだと思うのですが。 UPDATE テーブル AS A SET 順番 = (SELECT count(契約者ID) + 1 FROM テーブル AS B WHERE B.契約者ID < A.契約者ID ); これをやると、[更新可能なクエリである必要があります。] と出ます。 何が悪いのでしょうか?

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

 topを使うのをあきらめて、次の感じではいかがでしょう。 select * from tablea a where (select count(key1) from tablea b where b.key1 < a.key1) between 99 and 199 order by key1;  とりあえず、ソートするフィールドをkey1としてみました。  小さい順に、上から取っていくようにしてありますが、逆順ならサブクエリーの不等号をひっくり返せばOKのはずです。同一順位を考えるなら、>=とすれば大丈夫かと。  SQLの発想は、ようするに、自分よりも小さな数字を数えて、それが、99個なら自分は100位であると書いてあります。  よって、betweenに記載する数値は、順位値-1です。  他のデータベースで実験してますが、多分、access97でもいけるでしょう。  ただし、このクエリー、かなりの演算量を要求しますので、遅いです。データ数が多いと・・・使えないかもしれません。

noname#27115
質問者

お礼

ありがとうございます。 データは今のところ3000件ぐらいですが、やっぱり、速度が。。。 それで、 たとえば、もう一つ順序管理するフィールドを作って、そこに順序を書き込むようなアクションクエリは簡単にできないものでしょうか?

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 例えば、全レコード数が1000とすると、 まず降順にTOP 900(=1000-100)を取り出し、そこから昇順にTOP 100を取り出せば、結果的には101~200を取り出せると思います。 SELECT TOP 100 * FROM テーブル名 WHERE (((ユニークフィールド) In (SELECT TOP 900 ユニークフィールド FROM テーブル名 ORDER BY 判定フィールド DESC))) ORDER BY 判定フィールド; [判定フィールド]はTOP ○○を出すためのフィールドです。 [ユニークフィールド]はサブクエリーでデータ一致を判断するためのフィールドです。 ただし、境界で判定フィールドが重複する場合がやっかいかも知れません。

noname#27115
質問者

補足

どうもありがとうございます。 たとえば、同じ日付が120あって、最初に100番まで表示して、次の[次へ]ボタンかなんかで101から120とそれ以降の日付80レコードってのは無理っぽいですか?