• ベストアンサー

VB.NETでソートされたデータセットの取得

データ数が数十万レコードのテーブルがあります。 ここから上位1000件のレコードをデータセットに取得したいと思います。 しかし、この時点でソートがかけられないのでビューを作成時にソート をすることになると思います。 レコード数が少ない場合は、これでもいいのですが、多くなると、データ セットに取得する時点でかなり時間がかかります。 この場合、どういった方法が最適でしょうか? リーダーを使うのが普通でしょうか?

noname#27115
noname#27115

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

  • ベストアンサー
回答No.4

>最初は#2さんの回答のようにORDERを指定していましたが、それだと取得数(300)が取れなかったので、これは.NETの仕様かと思い、VIEWでORDERを指定しようと思いました。 もしかして.NET2005ですか? 件数の仕様は聞いた事がありませんが、2005はまだ触れてないので、正確にはわかりません。 私の.NET2002では普通に300件取れましたが、、、、 新規のプロジェクトを起こして、以下を実行したらどうなりますか? Imports System.Data.OleDb Module Module1   Sub Main()     Dim l_strPath As String = "C:\県ALL.mdb"     Dim l_strSQL As String = ""     l_strSQL &= "SELECT TOP 300 * FROM KEN_ALL" & vbCrLf     l_strSQL &= "WHERE(F7 Like '%府%')" & vbCrLf     l_strSQL &= "ORDER BY F5 ASC, ID ASC"     Dim l_cnn As New OleDbConnection( _               String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};", l_strPath) _           )     Dim l_cmd As New OleDbCommand(l_strSQL, l_cnn)     Dim l_adp As New OleDbDataAdapter(l_cmd)     Dim l_dst As New DataSet()     l_adp.Fill(l_dst)     MsgBox(l_dst.Tables(0).Rows.Count)   End Sub End Module

noname#27115
質問者

お礼

ありがとうございます。 もらったサンプルではTOP値で指定したレコード数が表示 されました。 私の作っているのではほとんど意味のない値ばかり表示 されていた上に、買った本のサンプルでは、SORTはView でしか実行されていなかったために勘違いしてしまいま した。 もう一度、自分のソースをよく見直してみようと思いま す。 なお、VB2005を使っています。

その他の回答 (3)

回答No.3

>Dim l_dstマスタ As DataSet >l_dstマスタ = データセット取得() >この時点でしょうか ん? >上位1000件のレコードをデータセットに取得 >しかし、この時点でソートがかけられないのでビューを作成時にソート と言われておりましたので、取得した後のデータセットをソートし、データセットに格納する方法を示したのです。 ですので最初の部分は、質問者さんの既存処理を表しております。 ちょっと整理しましょう。。。 >郵便番号データ(約12万件) >12万件のDatasetを取得しないと まず。。。 ・データベースは何でしょう?「オラクル?SQLサーバ?アクセス?などなど」 ・そのテーブル構成はどのようになっていますか。主にキーを知りたいです。 ・既存のデータセットを取得するときの文と、「300件ずつ」表示するための編集条件と、表示するためのソート条件 これらを示していただけませんか?

noname#27115
質問者

補足

すみません。中途半端で。 データは次のところから全フィールドをインポートしています。 フィールド名は仮にF1、F2、F3・・・としておきます。 http://www.post.japanpost.jp/zipcode/dl/kogaki.html それの他にIDというオートナンバーのフィールドをもちそれが 主キーです。テーブル名はKEN_ALLで、DBはAccessのMDBです。 SQLは "SELECT TOP 300 * FROM KEN_ALL WHERE(F7 Like '%府%')" という感じです。F7に都道府県名がはいっているとします。 最初は#2さんの回答のようにORDERを指定していましたが、 それだと取得数(300)が取れなかったので、これは.NETの 仕様かと思い、VIEWでORDERを指定しようと思いました。 "SELECT TOP 300 * FROM KEN_ALL WHERE(F7 Like '%府%') ORDER BY F5 ASC, ID ASC" oleDa = New OleDb.OleDbDataAdapter(SQL, oleCn) DAO、ADO、DataReaderだとTOP値が生きてくるのですが・・・

noname#187541
noname#187541
回答No.2

こんにちは。 データセットを取得する時にSQL文を発行して取得していれば、上位1000件をソートするSQL文を発行出来ればいいと思います。 SQL文は 昇順での並べ替えの場合 SELECT フィード名 FROM テーブル名 WHERE 抽出条件 ORDER BY フィールド名 ASC 降順はASCをDESCにします。

回答No.1

早い/遅いは、 ・現場の環境 ・あなたが発行しているSQ ・テーブルのキー状態と、そのオブジェクト間の関連性 などなど、、、 全てを知らない限り、何も言えません。 それらのことは、質問をするより、 「現場で思いつくパターンの簡単なサンプルをテスト実行する」 というのが、普通だと思います。 データセットのソート方法は以下に記します。 ------------------------------------------------------------------ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ '何らかの関数で、あらかじめデータセットは取得出来ているものとする Dim l_dstマスタ As DataSet l_dstマスタ = データセット取得() +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 'ソートをして、データを抽出する(抽出条件 = Nothing/ソート条件のみ指定) Dim l_drwデータロウズ As DataRow() Dim l_strソート条件 As String = "カラム1 ASC, カラム2 DESC" l_drwデータロウズ = l_dstマスタ.Tables("テーブル名").Select(Nothing, l_strソート条件) '抽出結果を、新たなデータセットへマージする(データテーブルでもマージ可能) Dim l_dstデータセット As New DataSet() l_dstデータセット.Merge(l_drwデータロウズ)

noname#27115
質問者

補足

たとえば、郵便番号データ(約12万件)で、それを郵便番号順に300件ずつ表示するとします。 ソートする以前に12万件のDatasetを取得しないといけないのですが、この時点で非常に 時間がかかってしまいます。 Dim l_dstマスタ As DataSet l_dstマスタ = データセット取得() この時点でしょうか・・・

関連するQ&A

  • VB6で、抽出したデータのソートについて

    はじめまして。 どうしても分からないので、どなたかご教授頂けたらと思います。 VB6で、抽出したデータのソートを行いたいと思います。 大まかな流れは以下の通りです。 Dim objDb As Database Dim objTbl As Recordset   'mdbファイルからデータを抽出   Set objTbl = objDb.OpenRecordset(データ抽出条件式) (1)レコードセットした、objTblにフィールドを1つ追加したい。 (2)その追加したフィールドにデータを入れる。 (3)入れたデータで降順にソートしたい。 どうしても出来ないので、元のmdbから任意のフィールドを取得してきて、 そこに必要なデータを入れてソートしようとしたら、 .updateでmdb自体のデータを更新しないと出来ませんでした・・・ (mdbファイルは更新・変更等の操作を行ってはダメなファイルです。) この後の処理があるので、レコードセットしたobjTbl (もしくはそのコピーでもいいのですが・・・)を使った形で、出来ると良いのですが・・・ どうぞ、よろしくお願いいたします。

  • 2つのテーブルのデータまとめて取得したい

    SQL Server2008を使用しているのですが、どうのようにデータを取得すれば良いか わからず困っております。 例えば、 名前は違うが全く同じテーブルが2つあるとします。 テーブルAには6レコード、テーブルBには3レコードのデータが存在するとします。 この時、単純に6レコード+3レコードの 9レコード分をひとつのテーブルとしてデータを 取得するにはどのようなSQL文を書けばよいでしょうか? SELECT * FROM テーブルA, テーブルBでは18レコードもデータを取得してしまい、且つ フィールド数も増加してしまいます。 宜しくお願いいたします。

  • ファイルメーカーでソート後のレコード番号を取得する

    1000件データがあって、ソートして20件にしたとします。その20件に連番を1から振って、その数字をエクスポートしたいです。ソート後のレコード番号を取得できる関数があるならそれでもかまいませんし、エクスポートで直接連番が書き出せるならその方がもっと助かります。 方法をご存知でしたら、ぜひご回答よろしくお願いいたします。

  • フィルタ後のフォームの件数の取得の仕方

    あくせすです。 テーブルを元にフォームにデータを表示させているのですが 元データのテーブルのレコード数が100件だとして 今フォーム上で手作業でフィルタをかけて表示しているレコード数が20件だとしたら、 この20件と言う数をVBAで取得する方法を教えてください。 DCountだと、元テーブルの全てのレコード数(フィルタ前)が取得されてしまいます。

  • 任意の件数の取得

    検索条件にマッチしたレコードのセットのうち、任意の件数、例えば1から100件、101から200件とか、取得する方法というのはありますか? DBはDB2です。 オラクルではあった気がするのですが、DB2は?と思っています。 もっと言うと、実装はHibernateを使用してアクセスしているので、Hibernateでそのような取得方法があるのならそれも教えていただきたいと思っています。 よろしくお願いします。 (ソートして連番ふるviewでも作ればいいのかな…などとも思っています。どうなんでしょ?)

  • VB 2005 データテーブルのソートについて

    恐れ入ります。 VB 2005 初心者です。 さっそく質問させていただきます。 VB 2005にて、SQL Server 2003を利用し、 とあるシステムを作成しています。 その中で、DBより取得したデータを、 DataTableのdatatblという変数に格納し、 さらにそのdatatblより、とある条件にて値が欲しくなったので、 dr = datatbl.Select("clm = " & strData & " AND clm2 = '0'") のようにし、DataRowのdrという変数につっこんでます。 ここで、ソートによる並んだデータとして値が必要になりました。 DBで取得し、条件でDataRowにつっこんだ後に、データを ソートすることは可能でしょうか? 可能であれば、やり方を教えていただけると幸いです。 宜しくお願いいたします。

  • ソート順の一番若い者を取得する

    お世話になります。 Oracle SQL文で質問があります 以下のようなテーブルから【結果】のような レコードを取得したいのです id id2 が同じものでsort順が一番若いものを 取り出すSQLです。 おわかりの方よろしくお願いします。 id id2 sort 1 1 1 1 1 2 1 2 1 1 2 2 1 2 3 1 3 1 【結果】 id id2 sort 1 1 1 1 2 1 1 3 1

  • DB内データのソート

     SQLServer2000を使って1週間の初心者です。  現在、ExcelからDBに対して数万件単位でデータをインポートしています。(DTSインポートウィザード使用)  インポート後、Enterpriseマネージャにてデータを見ると、ExcelとDBとの行の位置が異なっています。  (例)2万件を2回インポートした場合   ID_000001 ・ ・   ID_020000   ID_020059 ・ ・   ID_040000 ※ID_020001~ID_020058は、ID_020000以前のレコードの間に存在したりします。  一意である「ID_??????」行でSQL文ソート(ORDER BY)して見た目をExcelと同様の行順にしても、EnterPriseManagerでテーブルを閉じ、再度テーブルを開いたら以前のデータのままです。  ソート状態を上書き保存するようなことはできないでしょうか?  また、Excelと同じ行順でインポートする方法はないでしょうか?

  • 大量データの取得処理について

    テーブル1のレコードを全件取得し、取得したレコードの特定の項目を一件ずつチェックし、テーブル2の値を更新する処理を考えています。 しかし、テーブル1のレコード数が8万件存在するため、一気に全件を取得するのはまずいことになるのではと危惧しています。 そこで、fetch first ~ rows を使用するため、テーブル1に項目を追加し、更新が済んだらその項目にフラグを立てるような処理も考えましたが、 たった一度の処理のためにテーブルに項目を追加するのもどうかなと思っています。 1000件くらいずつ順番に取得できる良い方法があったら教えてください。 よろしくお願い致します。 ちなみにデータベースはDB2を使用しています。

  • レコードセットとデータセットの違い

    こんにちは。Access VBAの本を読んでいたらデータはレコードセットで取得すると書いてあります。 ネットで.NETの記事を読んでいたらデータはデータセットで取得と書いてありました。 このレコードセット、データセットの違いは平たく言うとなんでしょうか? 私はAccess VBAが少しわかる程度のレベルです。

専門家に質問してみよう