
ビューにて下記のように設定し「SQLの実行」は指定通りソート
されましたが、「ビューを開く」では、ソートされずテーブルの
並びのままでした。
SELECT TOP (100) PERCENT 端末コード, 端末番号
FROM dbo.T_端末
ORDER BY 端末コード
そこで、下記のように設定を変更したところ「ビューを開く」でも
ソートされるようになりました。
SELECT TOP (1000) 端末コード, 端末番号
FROM dbo.T_端末
ORDER BY 端末コード
TOP (件数) に全データ数以上を指定すれば機能するのは解りますが
「ビュー」とはそんな使い方なのでしょうか?
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の裏ワザの一つですと認識ください。
この数日悶々としていましたが、スッキリしました。
本当にありがとうございます。
ACCESSのMDBからADP+SQLに変えようとしているのですが・・・
このビューを表示させる(並び替える)のに、SELECTを使うとビューの
SELECTと合わせて二回のSELECTをサーバー側とクライアント側で
一回ずつ実行する訳ですよね?
効率が悪い様な気がして一回で済ませようと考えています。
そんな事はないのでしょうか?
(今は数は増えるかもしれませんが、基本的にビュー側でSELECTして、
ACCESS側はそのクエリーを表示させるように作ろうと考えています)
ビューだけでなく関数も同様ですのでパッチをあてたいのですが、
SP2の後の累積パッチ「SP2の累積プログラムその2」を見つける事が
出来ません、所在を教えて頂けると助かります。
No.4
- 回答日時:
>
http://support.microsoft.com/kb/936305/↑の先頭にある「修正プログラムのダウンロード」だと
64bitの環境しかありません、32bitのパッチは何処にあるのでしょうか?
これは気づきませんでした。32bit版だけ提供を打ち切っているのですね。その場合は累積プログラム3以降を使えばよいです。
http://support.microsoft.com/kb/939537/
ちなみに累積プログラムは文字通りそれまでのパッチが含まれます。
(すでに累積プログラムは9まで出ています)
>ビューは細工をせずに使い、細工する場合はテーブル値関数を使った方がいいと言うことでしょうか?
基本的にはその通りです。もし極力すべて(抽出も並び替えも)をサーバ側のオブジェクトに含めて処理してしまい、Accessは表示に徹するという考えなら、むしろストアドプロシージャを使う方がよいと思います(TOP 100 PERCENTをあてにする必要もなくなりますし)。
まあ、adpとの相性やそれ以外の使い勝手もあるでしょうから一概にはいえませんが。まあいろいろ試してみてください。
深夜の回答ありがとうございました。
結果を報告しますと、2をDLしてインストールしようとしたのですが、
更新する項目にチェックが入れられず、結局9をDLしてインストール
しました。
しかし、改善はされませんでした。
あれこれ変なパッチをあてようとしたのが原因だと思います。
現在は180日の評価版を使っていますので、サーバーを導入する時は
この辺を注意して作業します。
ビューについては教えていただいた方法で検討する事にします。
本当にありがとうございました、今後も質問することが多々あると思いますが、
何卒よろしくお願いします。
No.3
- 回答日時:
ビューの中にORDERを切ると、そのビューを照会するたびにORDERが実行されますので、基本的には非効率です。
たとえば、毎回Accessで抽出するデータは数十件なのに、テーブルには数万件のデータが入っているケースを考えてみてください。
テーブル関数ならば結果を絞って返すこともできますが、ビューの場合は本来なら数十件の並べ替えで済むところを、データベース側で毎回数万件の並べ替えを行うことになりかねません。
従って、常に全件近く戻す場合を除いてはビューの中にはORDERを切らない方がいいと思いますよ。
なお、累積プログラム2は以下です。
http://support.microsoft.com/kb/936305/
累積プログラムはSPに含まれるまでは、基本的に自己責任で当てると思った方がよいです。十分確認してからの適用をお勧めします。
何度も回答いただきありがとうございます。
あっちこっち探したのですがスキル不足で見つかりませんでした。
http://support.microsoft.com/kb/936305/
↑の先頭にある「修正プログラムのダウンロード」だと
64bitの環境しかありません、32bitのパッチは何処にあるのでしょうか?
> ビューを照会するたびにORDERが実行されますので非効率です。
ビューは細工をせずに使い、細工する場合はテーブル値関数を
使った方がいいと言うことでしょうか?
(イマイチビューと関数の使い分けが理解できておりません)
No.1
- 回答日時:
>「ビュー」とはそんな使い方なのでしょうか?
の意図するところはよくわかりませんが..
ビューを使用する目的としては、
セキュリティ上、全データでは無く一部のデータを見せるために使用するのが一般的ではないかと思います。(元のテーブルはセキュリティで制限して直接見えない様にして、ビューだけを見せる様にする)
または
よく使用する条件でビューを作成して使用する。
質問の例の、 TOP (100) PERCENT は意味が無いですね。
TOP句は書く必要がありません。
二つ目は、端末コードの若い順に1000行を選択する意味になります。
この回答への補足
ありがとうございます。 もう少し教えて下さい。
> TOP (100) PERCENT は意味が無いですね。
ORDER句があるとTOP句は自動で付与されてしまいます。
(本を読むと「ビュー」ではTOP句が無いときはORDER句も
指定できないからだと思います)
ただ、TOP (100) PERCENT だと並び替えされないのです。
「ビュー」で全件表示でソートするには最大件数以上の行数を
指定しないとソートできないのでしょうか?
TOP (100) PERCENT・・・並び替えしない
TOP (1000)・・・並び替わる
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
SqlServer2012 ビューとクエリ
SQL Server
-
Viewにインデックスは張れますか?
Oracle
-
ビューで引数を使いたい
SQL Server
-
-
4
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
5
view作成時にデータ型を変更したい(SQLServer2000)
SQL Server
-
6
SQLServerのselect文でデータ数1万くらいのDBから
SQL Server
-
7
ビューにインデックスを設定できませんか?
SQL Server
-
8
SQLServerで文字列の末尾からある位置で取出
SQL Server
-
9
Access2000、これはいったい・・・・
その他(データベース)
-
10
Excelで数値→文字列変換で指数表示になったものをいっぺんに直したい
Excel(エクセル)
-
11
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
12
GROUP BYを行った後に結合したい。
Oracle
-
13
ODBCの接続に失敗しました(3146)について
その他(Microsoft Office)
-
14
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
15
ORA-01013のエラーについて経験のある方お願いします。
Oracle
-
16
列名に変数を使うことはできないのでしょうか?
SQL Server
-
17
sqlserverにはグループ集計のfirstとlastがありません??
SQL Server
-
18
ユーザー定義関数内でのsp_executesqlプロシージャの使用
SQL Server
-
19
復旧中のデータベースについて
SQL Server
-
20
データベース関係で、データの洗い替えとはどのような事を行うことでしょう
IT・エンジニアリング
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
このISAMでは、リンクテーブル・・
-
【mysql : HTML】チェックボッ...
-
Accessでデータシートに同じデ...
-
ビューのソートについて
-
Oracleで上書きImportはできま...
-
Accessのテーブルデータを一気...
-
テーブルで一番古いレコードだ...
-
MS Accessを共有した際にファイ...
-
IF NOT EXISTを使用するINSERT文
-
同一テーブルのデータを参照し...
-
仕事のミス:本番データの削除→...
-
CONNECT BYに関して
-
Access昇順レコードを、5分割...
-
ORA-01401が表示され、データが...
-
Access(MDB)の複製(レプリケー...
-
住所のDBテーブル、マスターの...
-
アクセス レコードセットを更...
-
構文エラー : 演算子がありませ...
-
アクセスの処理方法
-
accessでレコード更新直後の反...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
Oracleで上書きImportはできま...
-
Accessのテーブルデータを一気...
-
テーブルで一番古いレコードだ...
-
このISAMでは、リンクテーブル・・
-
アクセス レコードセットを更...
-
ビューのソートについて
-
結合テーブルでINSERTする方法...
-
ORA-01401が表示され、データが...
-
ODBC接続で新しいレコードを追...
-
マテリアライズドビューとスナ...
-
accessでレコード更新直後の反...
-
MS Accessの列と行の入れ替えを...
-
重複クエリを使ったデータ削除
-
住所のDBテーブル、マスターの...
-
テーブル作成について
-
Access VBAからエクセルに出力...
-
処理の途中で停止させ、再開さ...
-
構文エラー : 演算子がありませ...
-
PostgreSQLでテーブル構成を変える
おすすめ情報