none
Fillの結果がソートされてしまう RRS feed

  • 質問

  • いきなり質問ですいません。

     

    ODBCで外部SQLSERVERへ接続しています。

     

    ORDER BY 句を指定してないのですが、FILL 結果がソートされてしまい困ってます。

    ソートされないようにする事は可能でしょうか?

     

    DataReaderで試しても、同じようにソートされてます。

     

    宜しくお願いいたします。

     

    2008年3月7日 0:54

回答

  • ソートされないようにすることはできません。毎回同じ順序で取得したいのであれば、きちんとソートキーを指定しなければなりません。ただし、SQL serverは主キーがあればその順で取得するように動いたと思います。ちょっと資料を探しましたがわかりませんでしたので、誤りかもしれません。

    2008年3月7日 1:43
    モデレータ
  • イディアさんがされたいことは理解できました。基本的にイディアさんがされた方針で良いと思います。
    少し違ったアプローチとして、BeginEditを使わずに伝票を読み取る度にFillだけで済まそうと思えば、
    select hoge, 1 as sortcolumn from table
    のようなselect文を作成して発行し、DataViewでsortcolumnでソートすれば良いと思います。sortcolumnの値は発行する毎に1ずつインクリメントさせます。
    Fillは実行する度にデータテーブルにレコードが追加されていきます。

     

    他の方法として、まとめてselectするのであれば、ストアドプロシージャ内で
    伝票オーダー  1
    伝票オーダー  2
    伝票オーダー  3
    伝票オーダー  4
    伝票オーダー  5
    のようなリストから一時テーブルを作成し、それとinner joinして番号でソートしたものを返すということも考えられます。

     

    いずれにしても伝票オーダーにソート順を示した項目を結びつける必要があることは間違いありません。

    2008年3月7日 6:10
    モデレータ

すべての返信

  • ソートされないようにすることはできません。毎回同じ順序で取得したいのであれば、きちんとソートキーを指定しなければなりません。ただし、SQL serverは主キーがあればその順で取得するように動いたと思います。ちょっと資料を探しましたがわかりませんでしたので、誤りかもしれません。

    2008年3月7日 1:43
    モデレータ
  • terapemiyaさん お返事ありがとうございます。

     

    同じテーブル・同じ接続方法で UNION ALL を試してみました。

    UNION ALL で 行うと、クエリにセットしたパラメータ順に結果がでました。

    UNION ALL だと・・恐ろしく時間が掛かるので、出来れば使いたくないところです;;

     

    Terapemiyaさんのおっしゃる様に、主キー自動ソートがSQLSERVERの仕様だとすると...

     

    可能だったよーな曖昧記憶ですが、

    dataset.tables に対して、パラメータインデックスを更新挿入し、その後、パラメータインデックス順にソートさせる

    って手段位しか 思いつかないです。

     

    他に 一般的と思われる 手法って 思い当たりませんでしょうか?

     

     

     

    2008年3月7日 2:03
  • UNION ALLを試された趣旨がよくわかりませんでした。ソート順とどのような関係があるのでしょうか???

    order byを指定せずに正しい順序で受け取りたいということは、レコードを追加した順序で受け取りたいということなのでしょうか?

    いずれにしても取得順序を保障するためには、どのような場合でも必ずorder byで指定しなければなりません。

     

    イディアさんがされたいことがもう少し正確にわかれば、いくらかアイディアが出せるかもしれません。

     

    #ひょっとして、1行ずつUNION ALLでつなげたのでしょうか?

    2008年3月7日 2:41
    モデレータ
  • trapemiya さん お返事ありがとうございます。

     

    union all の説明で、ms公式ではないですが、sqlエンジンによる並び替えは指定しない限り 行われない と言うのを

    見た記憶から 試してみました。

    #ひょっとして、1行ずつUNION ALLでつなげたのでしょうか?

    >あくまでテストという事で・・・・10件程度で行ってみました;;

     

    BeginEdit~

    Datasetの不要列に、パラメータインデックスを入れて、DATAVIEWを作成後、パラメータインデックスをキーにソートは

    実現できました。

     

    これが 正当な 方法かは 不明です...。

     

    行いたい事ですが、

     

    ランダムに並んだ 伝票のオーダーを スタックリーダーで 読み取ってます。

    そのオーダーを キーに DBから 必要な 情報を 取得し、 そのオーダーの順番どおりの結果表示をしたい。

    順番が狂うと 伝票とデータの アイチェックが 大変となるためです。

     

    DB件数は 300万件と 80万件 の 2テーブルを LEFT OUTER JOIN で結合

    一回で利用する オーダー数は 1,000-2,000 件 です

     

    というのが、内容となります。

     

    2008年3月7日 4:13
  • イディアさんがされたいことは理解できました。基本的にイディアさんがされた方針で良いと思います。
    少し違ったアプローチとして、BeginEditを使わずに伝票を読み取る度にFillだけで済まそうと思えば、
    select hoge, 1 as sortcolumn from table
    のようなselect文を作成して発行し、DataViewでsortcolumnでソートすれば良いと思います。sortcolumnの値は発行する毎に1ずつインクリメントさせます。
    Fillは実行する度にデータテーブルにレコードが追加されていきます。

     

    他の方法として、まとめてselectするのであれば、ストアドプロシージャ内で
    伝票オーダー  1
    伝票オーダー  2
    伝票オーダー  3
    伝票オーダー  4
    伝票オーダー  5
    のようなリストから一時テーブルを作成し、それとinner joinして番号でソートしたものを返すということも考えられます。

     

    いずれにしても伝票オーダーにソート順を示した項目を結びつける必要があることは間違いありません。

    2008年3月7日 6:10
    モデレータ
  • こんにちは。中川俊輔 です。

     

    trapemiyaさん、回答ありがとうございます。

     

    イディアさん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?

    有用な情報と思われたため、

    勝手ながらtrapemiyaさんの回答へ回答済みチェックをつけさせていただきました。

    追加の質問等ありましたら、是非投稿してください!

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    イディアさんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

     

    2008年3月12日 6:51