あなたのユーザーはSQLについてまったく知らないかも知れないが、その価値についてはしっている可能性が高い。SQLはあらゆる場所で使われており、学ぶのも簡単で、SQLを使ったソリューションは実装も簡単だ。SQLをあまり使わないにしろ、よく使うにしろ、SQLを賢く使えば、エラーを避け、性能を向上させることができる。
多くのSQLは各ベンダー独自の仕様を持っている。以下で紹介するヒントはJetとTransact-SQLで使えるものだが、ほとんどのSQL製品はこれに似ている。
1: AccessのSQLウィンドウでJet SQLを利用する
Accessユーザーは、クエリを作成するたびにSQLステートメントを作成している。ただ、彼らがそれを知らないだけだ。彼らが使っているクエリデザインウィンドウは、実際にはSQLを視覚的に表現したものだ。ほとんどのユーザーは、自分が必要とする適切なSQLステートメントを作ることはできないため、視覚的なインターフェースは助けになるが、これはあなたも便利に使えるものだ。もし頭の中だけでエラーのないSQLコードを作ることができないのであれば、このSQLウィンドウに助けてもらうといいだろう。
- クエリデザインウィンドウを使ってクエリを作成し、そのSQLウィンドウのコードを、VBAモジュールのコード内にコピーする。
- もしそのコードのクエリが、VBAの無意味なエラーメッセージを返すようであれば、そのSQLステートメントをSQLウィンドウにコピーして実行してみるとよい。Accessは通常、エラーに関してVBAよりもましな情報を返してくれる。
モジュールの中のSQLステートメントを、そのままSQLウィンドウにコピーしてはいけない場合もある。ステートメントに連結演算子や変数が含まれている場合、定義ステートメントの直後にDebug.Printステートメントを追加しておくとよい。そして、ステートメントのデバッグが必要な場合は、評価後のステートメントをイミディエイトウィンドウからコピーする。たとえば、次のコード中のステートメントには変数と連結演算子が含まれているため、そのままではSQLウィンドウで実行することはできない。
"SELECT * FROM " & tbl & " ORDER BY " & fld
しかし、このステートメントの後にDebug.Printステートメントを付けておけば、イミディエイトウィンドウから、次のような評価後の結果をコピーすることができる。
SELECT * FROM Employees ORDER BY HireDate
2: SQLの予約語
SQLにはキーワードなどのいくつかの予約語がある。カラム、テーブル、変数、あらゆるオブジェクトの名前には、これらの単語は使えない。SQLエンジンが予想していないコンテクストでこれらのキーワードが使われると、SQLエンジンは混乱しエラーになる -- あるいはもっとひどい場合には、正しくない結果が出る。
3: ALL、DISTINCT、DISTINCTROWの違い
SQLのSELECTステートメントは、ALL、DISTINCT、DISTINCTROWという3つの述語をサポートしている。デフォルトはALLで、指定された条件を満たすすべてのレコードを返す。DISTINCTは、返してくるカラムに含まれる値を1つだけに制限する。たとえば、次のステートメントを実行すると、LastNameの値1つにつき、1つのレコードしか返されない。
SELECT DISTINCT LastName
言い方を変えれば、もしJohn SmithとMary Smithにそれぞれ1つのレコードが存在する場合、上記のステートメントはSmithという名字(LastName)に関してどちらか1つのレコードしか返さない。ただし、DISTINCTは直後に指定されたカラムだけでなく、それ以降に指定されたすべてのカラムに対して適用される。つまり、次のステートメントを使った場合、John SmithとMary Smithのどちらについても1つのレコードを返す。これは、その2つのカラムを組み合わせれば、同じレコードは生成されないためだ。
SELECT DISTINCT LastName, FirstName
SELECT句で1つ以上のカラムが指定されている場合、返されたレコードの選択されたカラムの値の組み合わせは一意となる。
DISTINCTには、ユーザーが知っておくべき、いくつかの予想しにくい特徴がある。
- DISTINCTをアスタリスクと一緒に使ってはならない。カラムは名前で指定する必要がある。
- これは当然のことだが、DISTINCTを使ったクエリの結果は更新することができない。
DISTINCTがカラムに対して使われるのに対し、DISTINCTROWはレコードに対して使われる。(Transact-SQLではDISTINCTROWはサポートされていない)。この述語には、以下に挙げるようないくつかの独自の制約があり、これがトラブルシュートが困難なエラーの原因になる場合もある。
- クエリにテーブルが1つしかない場合、エンジンはDISTINCTROWを無視する。
- 使用するすべてのテーブルのすべてのカラムが指定された場合、エンジンはDISTINCTROWを無視する。
「IT業界を生き抜く秘密10箇条」 のバックナンバー
-
ITプロジェクト失敗の6タイプ
ITプロジェクトはさまざまな理由で失敗するが、それを防ぐためには原因について議論し理解する必要がある。この記事では、その原因を理解するのに役立つ、プロジェクト失敗のタイプを説明する。 -
7つの機能で探るWindows 7の魅力
-
厳選!マイクロソフトのフリーソフト10傑
-
スピーチやプレゼンテーションに潜む10個の落とし穴--そして、その避け方
-
ITプロジェクトを成功に導くための7つの基盤
- IT業界を生き抜く秘密10箇条 一覧へ »
-
新型インフルエンザ等のパンデミック時に対応できるユーザー認証のあり方と仕組み
- 圧倒的なWeb会議市場シェアを誇る「nice to meet you」のご紹介
- パンデミックでも社員を守り業務継続を支援する
- 企業コスト削減の傾向と対策 〜最新アプローチのトレンド〜
- ITコスト削減の傾向と対策 〜情報システム部様限定〜
- SOA による製造ラインとバックエンド レガシー メインフレームの統合
- 異種データベースサーバ統合による戦略的コスト削減のススメ
- 企業における情報セキュリティ実態調査
- コスト削減!が至上命題の今だから…、ウェブテレビ会議で移動費削減、業務効率化の...
- アメリカ固定・移動通信市場の最新トレンド/ICT政策を分析――「米国通信市場総覧20...
企画特集
-
マネジメントの「コラム」と「コネタ」
今日のキーパーソンは誰? -
求めているのはSIerのエンジニア!!
連載インタビュー第1話、グリーCTO藤本氏が語る -
100万円で実現!中小企業の情報漏えい対策
中小企業の課題!?セキュリティ管理者不在でも大丈夫 -
【最終警告】パンデミック対策特集
サービス品質を保証するためのリスクマネジメントとは -
―エン・ジャパン厳選求人☆毎週更新―
ハンゲームの社長が語る・人材とサービスの在り方 -
企業ITシステムの企画、構築、運用のイロハ
戦略的なITシステムのために、今考えるべきポイント -
大丈夫?あなたの会社のセキュリティ対策
中堅・中小企業のネットワーク・セキュリティを考える -
進むストレージ環境の見直し
仮想環境に最適なiSCSIストレージLeftHandのメリット -
最大32個のセンサーが電力を徹底管理!
『省エネ性能』追求HPx86サーバー徹底レビュー -
J-SOX法制定により内部統制の整備が急務に
重要性高まるActive Directoryの課題と対処法を公開中 -
急増するオンライン犯罪への解決策!
オンラインサービス保護ソリューション -
情報漏えいを食い止める!
証跡としての信用力を高めるメールアーカイブとは? -
VMware OEMベンダー6社を独占インタビュー
IBM、HP、NEC、DELL、日立、富士通のVMwareの取り組み
-
1.並列性のための包括的ソリューション
Intel Parallel Studioが、いかにVisual Studioを拡張し、並列プログラ... -
2.Advisor概要
Intel Parallel Advisorについての2分間の概要紹介で、プログラマが自分...
新着企業動向
-
Macintosh用DVDコピー/動画変換ソフトウエアの最新版「Roxio Popcorn 4」を11月6日に販売開始
ラネクシー -
【東京会場】12/5(土)プログラミングからWeb デザインまで、高速・高機能のテキストエディ...
エムソフト -
「知って楽しむオトナのたしなみ」出張アテンダント編を公開しました!読者プレゼント企画も...
日立システムアンドサービス -
メールセキュリティSaaS『Mail Luck!セキュアタイプゲートウェイ』
NTTPCコミュニケーションズ(ネットワーク事業部) - 企業動向一覧へ»
