none
ORDER BY句を使用したビューをクエリー側でWHERE句をしてして呼び出した時(SQL Server 2008) RRS feed

  • 質問

  • 既知の問題として、下記のFIXがリリースされています。

    「[FIX] SQL Server 2008 で ORDER BY 句を使用したビューを使用してクエリを実行しても結果がランダムな順序で返される」

    当方でもこのFIXを当てたところ、正しい結果を得られるようになりました。

    しかしながら、ビューのORDER BY句で指定した列をクエリー側のWHERE句で指定した場合のみ、ビューで指定したORDER BYが効かなくなり、正しい結果が得られません。

    これは、既知の問題でしょうか?
    対処の方法があればご教授願います。

    【SQL Server 2008 Standard】

     

    2011年9月24日 9:46

すべての返信

  • 具体的なSQLが無いと、対処も何も手が出せないです。

    テーブル名や列名を適当なモノに書き換えるなどして、提示する事は出来ませんか?

    2011年9月27日 1:20
  • 具体的な例を挙げずにすみませんでした。

    例えば以下のようなビュー[view1]があったとして、

    [view1]
    -------------------------------
    select
    TOP 100 PERCENT fld1,fld2,fld3
    from table1
    order by fld3
    -------------------------------

    クエリー側で

    select * from view1

    のような呼び出しをした際はFIXバッチが効いていて、fld3でソートされます。

    しかしながら、

    select * from view1 where fld3='hoge'

    とwhere句にorder byで指定したカラムを条件に加えると、ソートがされません。

     

    説明として十分かどうかわかりませんが、何卒よろしくお願い致します。

    2011年9月27日 10:49
  • [FIX] SQL Server 2008 で ORDER BY 句を使用したビューを使用してクエリを実行しても結果がランダムな順序で返される
    http://support.microsoft.com/kb/926292/ja

    上記に書かれている互換性レベルの変更等は適切に行われているということでよろしいでしょうか?
    そのうえで問題が発生するのでしたら、マイクロソフトさんへ報告するしかないように思います。

    ただ、上記資料にも書かれていますが、本来はビューを使用する側を修正して次のように order by を明示すべきです。
    http://msdn.microsoft.com/ja-jp/library/ms188385.aspx の注意事項の通り)

    select * from view1 where fld3 = 'hoge' order by fld3

    でもこの例の場合、fld3 を1つの値に絞り込んだ後にその fld3 で並べることは無意味に思えます。
    例が悪いだけかなとも思いましたが、lynx_2000 さんの文面でもそう書かれてますね。

    もしかして lynx_2000 さんが期待されている結果は、
    select * from view1
    の結果での fld3 が 'hoge' の行の並びと、
    select * from view1 where fld3='hoge'
    の結果の並びが一致すべきということでしょうか?

    そうですと、order by に指定していない項目の並びは不定だと思うので、一致しなくてもそれで正常なように思います。
    報告されてたとしても、仕様という回答になりそうに思います。
    この結果において SQL Server 2000 と互換性がたとえなくても、そもそも不定な結果に依存されていたことになるのかなと思いました。

    対策としては、view1 の定義の order by に他の項目も追加することで、並びが一意になるようにされてはいかがでしょうか?

    • 回答の候補に設定 山本春海 2011年10月12日 7:06
    2011年9月27日 11:45
  • TH01 様
    ご回答いただきありがとうございます。


    >[FIX] SQL Server 2008 で ORDER BY 句を使用したビューを使用してクエリを実行しても結果がランダムな順序で返される
    >http://support.microsoft.com/kb/926292/ja
    >
    >上記に書かれている互換性レベルの変更等は適切に行われているということでよろしいでしょうか?
    >そのうえで問題が発生するのでしたら、マイクロソフトさんへ報告するしかないように思います。


    上記パッチを適用した上で、互換性レベルを「SQL Server 2000 (80)」に設定しております。

    また、直前の投稿で当方が示したビューの具体例については
    TH01 様ご指摘のとおり、現象を再現させるために十分なものではありませんでしたので
    [view1]の定義と、実行するクエリを下記のように訂正させていただきます。

    [view1]
    -------------------------------
    select
    TOP 100 PERCENT fld1,fld2,fld3
    from table1
    order by fld2,fld3
    -------------------------------

    [実行するクエリ]
    -------------------------------
    select * from view1
    where (fld3='hoge1'
    or  fld3='hoge2'
    or  fld3='hoge3')
    -------------------------------

    上記クエリを実行し
    fld2 列及び fld3 列の 'hoge1','hoge2','hoge3' が昇順でソートされることを期待しているのですが
    結果セットの並び順はソートされず、クエリ実行の度に変化(ランダム)してしまいます。

    度々申し訳ありませんが、ご教示いただけますでしょうか。
    2011年9月28日 11:26
  • SQL Server 2000 では期待する結果だったのですね?

    そうでしたら、やはりマイクロソフトさんに問い合わせるしかないのかなと思います。
    ただ、たとえ不具合があって修正されるとしても公開されるのはずっっと先になると思うので、やはりクエリを修正された方がいいと思います。


    追記:念のための確認ですが、「トレース フラグ 168 を有効」も行われていますよね?
    • 編集済み TH01 2011年9月28日 12:12 追記
    • 回答の候補に設定 山本春海 2011年10月12日 7:06
    2011年9月28日 11:52