ビューのソートについて

このQ&Aのポイント
  • ビューにて指定したソート順でSQLが実行されるが、ビューを開く際にはソートが適用されないことがある。
  • 特定の設定変更により、ビューを開く際にもソートが適用されるようになる。
  • TOP(件数)に全データ数以上を指定することで、ソートが機能するが、ビューの本来の目的とは異なる使い方となることがある。
回答を見る
  • ベストアンサー

ビューのソートについて

ビューにて下記のように設定し「SQLの実行」は指定通りソート されましたが、「ビューを開く」では、ソートされずテーブルの 並びのままでした。 SELECT TOP (100) PERCENT 端末コード, 端末番号 FROM dbo.T_端末 ORDER BY 端末コード そこで、下記のように設定を変更したところ「ビューを開く」でも ソートされるようになりました。 SELECT TOP (1000) 端末コード, 端末番号 FROM dbo.T_端末 ORDER BY 端末コード TOP (件数) に全データ数以上を指定すれば機能するのは解りますが 「ビュー」とはそんな使い方なのでしょうか?

  • SEsyo
  • お礼率78% (64/82)

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

ビューを単純に照会したときにORDER句を切らなくても希望する並び順でSELECTできれば、運用上は便利なことが多いです。 そのため、SQL Serverでは昔からTipsでTOP 100 PERCENTで並び替える方法が認識されていました。 (Tipsとある通り、普通はViewの外でOrder切ります) ただし、SQL Server 2005になって、TOP 100 PERCENTは「並び替えの必要なし」とオプティマイザが判断するように仕様が変更されてしまいました。そのため、SQL Server 2005ではTOP 100 PERCENT句をViewに切っても並び替えは起こりません。 それだけなら分かりやすいのですが、やはりこの技を使っていた人が多かったためでしょうか。SP2の後の累積パッチ「SP2の累積プログラムその2」でこれを修正するモジュールが提供されています。 SP2には入っていないし、わざわざ当てる人も少ないと思うので、次のSP3が出たとして、それ当てた時からTOP 100 PERCENTが効くようになるでしょう。 ちなみにSQL Server 2008でも初期バージョンではTOP 100 PERCENTが効かず、累積パッチが提供されています。 ということで、そのようなビューの使い方は正しいアプローチではありませんが、SQL Serverの裏ワザの一つですと認識ください。

SEsyo
質問者

お礼

この数日悶々としていましたが、スッキリしました。 本当にありがとうございます。 ACCESSのMDBからADP+SQLに変えようとしているのですが・・・ このビューを表示させる(並び替える)のに、SELECTを使うとビューの SELECTと合わせて二回のSELECTをサーバー側とクライアント側で 一回ずつ実行する訳ですよね? 効率が悪い様な気がして一回で済ませようと考えています。 そんな事はないのでしょうか? (今は数は増えるかもしれませんが、基本的にビュー側でSELECTして、 ACCESS側はそのクエリーを表示させるように作ろうと考えています) ビューだけでなく関数も同様ですのでパッチをあてたいのですが、 SP2の後の累積パッチ「SP2の累積プログラムその2」を見つける事が 出来ません、所在を教えて頂けると助かります。

その他の回答 (3)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.4

>http://support.microsoft.com/kb/936305/ ↑の先頭にある「修正プログラムのダウンロード」だと 64bitの環境しかありません、32bitのパッチは何処にあるのでしょうか? これは気づきませんでした。32bit版だけ提供を打ち切っているのですね。その場合は累積プログラム3以降を使えばよいです。 http://support.microsoft.com/kb/939537/ ちなみに累積プログラムは文字通りそれまでのパッチが含まれます。 (すでに累積プログラムは9まで出ています) >ビューは細工をせずに使い、細工する場合はテーブル値関数を使った方がいいと言うことでしょうか? 基本的にはその通りです。もし極力すべて(抽出も並び替えも)をサーバ側のオブジェクトに含めて処理してしまい、Accessは表示に徹するという考えなら、むしろストアドプロシージャを使う方がよいと思います(TOP 100 PERCENTをあてにする必要もなくなりますし)。 まあ、adpとの相性やそれ以外の使い勝手もあるでしょうから一概にはいえませんが。まあいろいろ試してみてください。

SEsyo
質問者

お礼

深夜の回答ありがとうございました。 結果を報告しますと、2をDLしてインストールしようとしたのですが、 更新する項目にチェックが入れられず、結局9をDLしてインストール しました。 しかし、改善はされませんでした。 あれこれ変なパッチをあてようとしたのが原因だと思います。 現在は180日の評価版を使っていますので、サーバーを導入する時は この辺を注意して作業します。 ビューについては教えていただいた方法で検討する事にします。 本当にありがとうございました、今後も質問することが多々あると思いますが、 何卒よろしくお願いします。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

ビューの中にORDERを切ると、そのビューを照会するたびにORDERが実行されますので、基本的には非効率です。 たとえば、毎回Accessで抽出するデータは数十件なのに、テーブルには数万件のデータが入っているケースを考えてみてください。 テーブル関数ならば結果を絞って返すこともできますが、ビューの場合は本来なら数十件の並べ替えで済むところを、データベース側で毎回数万件の並べ替えを行うことになりかねません。 従って、常に全件近く戻す場合を除いてはビューの中にはORDERを切らない方がいいと思いますよ。 なお、累積プログラム2は以下です。 http://support.microsoft.com/kb/936305/ 累積プログラムはSPに含まれるまでは、基本的に自己責任で当てると思った方がよいです。十分確認してからの適用をお勧めします。

SEsyo
質問者

お礼

何度も回答いただきありがとうございます。 あっちこっち探したのですがスキル不足で見つかりませんでした。 http://support.microsoft.com/kb/936305/ ↑の先頭にある「修正プログラムのダウンロード」だと 64bitの環境しかありません、32bitのパッチは何処にあるのでしょうか? > ビューを照会するたびにORDERが実行されますので非効率です。 ビューは細工をせずに使い、細工する場合はテーブル値関数を 使った方がいいと言うことでしょうか? (イマイチビューと関数の使い分けが理解できておりません)

回答No.1

>「ビュー」とはそんな使い方なのでしょうか? の意図するところはよくわかりませんが.. ビューを使用する目的としては、 セキュリティ上、全データでは無く一部のデータを見せるために使用するのが一般的ではないかと思います。(元のテーブルはセキュリティで制限して直接見えない様にして、ビューだけを見せる様にする) または よく使用する条件でビューを作成して使用する。 質問の例の、 TOP (100) PERCENT は意味が無いですね。 TOP句は書く必要がありません。 二つ目は、端末コードの若い順に1000行を選択する意味になります。

SEsyo
質問者

補足

ありがとうございます。 もう少し教えて下さい。 > TOP (100) PERCENT は意味が無いですね。 ORDER句があるとTOP句は自動で付与されてしまいます。 (本を読むと「ビュー」ではTOP句が無いときはORDER句も 指定できないからだと思います) ただ、TOP (100) PERCENT だと並び替えされないのです。 「ビュー」で全件表示でソートするには最大件数以上の行数を 指定しないとソートできないのでしょうか? TOP (100) PERCENT・・・並び替えしない TOP (1000)・・・並び替わる

関連するQ&A

  • テーブル値関数経由でのデータ更新

    AccessのADPからSQLへアクセスしているのですが ↓のテーブル値関数(Q_仕訳明細)をレコードソースに指定してある フォームがあるのですが、コントロールの内容を変更してレコードを 移動させると、テーブルに変更した内容が反映されます。 そう言う物であれば、ビューよりも利用価値があると思うのですが、 私が変な設定をしているのでしょうか? ALTER FUNCTION [dbo].[Q_仕訳明細] () RETURNS TABLE AS RETURN SELECT TOP 100 PERCENT 請求番号, 行番, 部門コード,勘定科目コード, 補助科目コード, 摘要, 金額, 税区分 FROM T_仕訳明細 ORDER BY 請求番号, 行番

  • MySQLのソートについて

    こんにちわ。 今PHPとMySQLでデータベースの練習をしています。日本語をソートすると変な順番にソートされてしまいます。 SELECT * FROM NAME_T ORDER BY NAME_KANA_C NAME_KANA_Cには名前が全角カナで入力されてます。 これでソートしますと、 テ*** ハ*** ヒ*** フ*** ときて、なぜか シ*** となります。これは何故なんでしょうか? よろしくお願いします。 文字コードはEUCです。

  • ソートと列番号

    データ取得時に列番号を組み込みたい場合 ROW_NUMBER() OVER (ORDER BY ソートキー) で実現できますが、これは実際ソートも行ってくれるのでしょうか? 例えば 1) select dt1,dt2, dt3,ROW_NUMBER() OVER (ORDER BY dt1,dt2,dt3) as dt4 from table_1 2) select dt1,dt2, dt3 from table_1 ORDER BY dt1,dt2,dt3 では同じ順序でデータが取得されるのでしょうか? 簡単にデータを作ってみたところ、同じようなんですが・・・・

  • MySQL4でViewの代わりにできますか?

    PostgreSQLで下記のようなビューを作成し、そのビューから日付でgroupbyして日付ごとのユニーク件数を取っていました。 ---------------------------------------------- create view v_uniqcountday as select substring(datetime, 1, 8) as date, uniqid, careercd, count(*) as cnt from accesslog group by date, uniqid, careercd order by date; select date, count(*) as cnt from v_uniqcountday where (date >= xxx) and (date < xxx) group by date; ---------------------------------------------- しかし、MySQLではViewは作成できないようです。 そこでselect文のみで上記のような集計は可能でしょうか? よろしくお願いいたします。

  • viewでfrom句にサブクエリが書けない

    こんにちは。MYSQLのVIEWの代替についてお教え下さい。 下記でinner joinについて教えて頂きました。 http://okwave.jp/qa/q7296711.html 環境はWin 7 MYQL5です。 t1テーブルのデータ ID,在庫 001,22 t2テーブルのデータ ID,出庫 001,17 001,3 SELECT A.z AS `在庫`,B.* FROM (SELECT SUM(stock) AS z FROM t1 WHERE id='001' GROUP BY id) A INNER JOIN t2 B ON A.id=B.id というコードで、それぞれのテーブルをグループ化してグループ化したもの同士をJOINしました。 このコードを元にVIEWを作り、そのVIEWを対象にクエリを作ろうと考えていました。 しかしながら、MYSQLのVIEWではFROM句でサブクエリは使えませんでした。 http://www.klab.jp/media/mysql/index4.html 上記のコードを書きなおして、なんとしてもVIEWで利用したいのですが、FROM句でサブクエリを使わずにVIEWを作成する方法がわかりません。 どのようにリライトすればよいか、ご助言お願い致します。

    • ベストアンサー
    • MySQL
  • DISTINCTで選択した項目以外でのソート

    お世話になります。 SQLサーバ2000から、SQLサーバ2008への移行を行っております。 以下のようなSQL文は2000では許容されていたようで、問題なく(?)稼働していただのですが2008に移行したら軒並みエラーになってしまいました。 エラーで稼働確認が進まないので、修正方法を検討しているのですが、まだSQLサーバが使えない環境で確認ができません。 2000が来てから確認する予定ではありますが、以下の通りで新旧・同様のソート順になると考えて問題ございませんでしょうか。 教えていただけると幸甚です。 【例1】 SELECT DISTINCT ISNULL(T1.C1,""),T1.C2 FROM T1 ORDER BY T1.C1 →ORDER BY 項目を ISNULL(T1.C1,"")に変更 【例2】 SELECT DISTINCT T1.C1,T1.C2 FROM T1 ORDER BY T1.C1,T1.C3 →ORDER BY 項目から T1.C3 を削除する 以上です。宜しくお願いいたします。

  • accessのリストボックスでデータをソートして表示する

    いつもお世話になっております。 Accessを使っております。 リストボックスに下記コードでデータを表示して います。 Me.lstA.RowSource = "SELECT 月 FROM 入金表 ORDER BY 月" 「月」はString列なのですが、ソートして表示すると ----------------------------  10  11  1  3  6  7 ---------------------------- と表示されます。これを ----------------------------  1  3  6  7  10  11 ---------------------------- と表示させたいのですが、何かいい方法はないで しょうか? よろしくお願いいたします。

  • UNIONなどで複数のテーブルから上位10件などSELECTする方法

    1店舗1テーブルのデータベースにしております。 全店の在庫を検索した時に、まとめてSELECTすると重いため、 TOP100などで、1~100,100~200などと分けたいです。 単テーブルでの分け方は何とか分かっていますが、 複数のテーブルをUNIONで結合した場合の分け方が分りません。 ■ 現状:全店の在庫を各店のテーブルより、取得しています。 SELECT dbo.A店TB.ID, dbo.A店TB.BRAND, dbo.A店TB.CODE, dbo.A店TB.STOCK, dbo.A店TB.STORE FROM dbo.A店TB" + " where dbo.A店TB.CODE like '%" + txbCode.Text + "%' AND" + " dbo.A店TB.BRAND like '%" + txbBrand.Text + "%' AND" + " dbo.A店TB.STOCK > 0" + " UNION " + "SELECT dbo.B店TB.ID, dbo.B店TB.BRAND, dbo.B店TB.CODE, dbo.B店TB.STOCK, dbo.B店TB.STORE FROM dbo.B店TB" + " where dbo.B店TB.CODE like '%" + txbCode.Text + "%' AND" + " dbo.B店TB.BRAND like '%" + txbBrand.Text + "%' AND" + " dbo.B店TB.STOCK > 0" + " UNION " + "SELECT dbo.C店TB.ID, dbo.C店TB.BRAND, dbo.C店TB.CODE, dbo.C店TB.STOCK, dbo.C店TB.STORE FROM dbo.C店TB" + " where dbo.C店TB.CODE like '%" + txbCode.Text + "%' AND" + " dbo.C店TB.BRAND like '%" + txbBrand.Text + "%' AND" + " dbo.C店TB.STOCK > 0" ■ 問題:1店舗、1万レコード(件)のデータがあり、実際には10店舗ほどからデータを取ってくるため、読み込みに時間がかかってしまいます。 ■ やりたいこと:最初の100件だけをSQLのSELECTで取得するクエリを書きたいです。別のプログラムで以下のように書きましたが、 これを上記のUNIONを使ったクエリでもやりたいと考えています。具体的なコードが思いつきません。お願いします。 SELECT TOP 100 BlogTB.TITLE,BlogTB.TEXT " + "FROM BlogTB WHERE ID NOT IN(SELECT TOP 200 ID FROM BlogTB ORDER BY ID DESC) ORDER BY ID DESC"

  • 指定文字以降のソート方法

    以下のようなテーブル(てすと)があったとします。   (列)  AAA-2999 … (1)  BBB-4999 … (2)  CCC-3999 … (3)  DDD-1999 … (4) クエリ:SELECT 列 FROM てすと (ORDER BY ???) 結 果:(4)・(1)・(3)・(2) このテーブルを"-"以降で昇順にソートしたいのですが、ORDER BY句を用いてできるのでしょうか?

  • 都道府県順、北からソートしたいのですが

    テーブルに下記データがあって、 SELECT ken,count(*) c from table group by ken order by c --------- 東京 8 大阪 7 北海度 4 名古屋 3 沖縄 1 これを 北から順にソート --------- 北海度 4 東京 8 名古屋 3 大阪 7 沖縄 1 と、いうふうに都道府県でソートするのにいい方法はありますか? 配列を使ったりしないと駄目でしょうか?