[SQL Server]WITH句で共通テーブル(CTE式)を使用する

[スポンサードリンク]

共通テーブル(CTE式)の使い方

共通テーブルを使うメリット

ソースの可読性を向上する

同じテーブルの副問い合わせや、同じテーブルの結合など。
SQLの冗長化を防ぎ、ソースを見やすくすることができる。

テーブルの結合前に行数を減らしておくことができる

行数の多いテーブル同士を結合すると、結合条件式の処理にも時間がかかり、クエリのパフォーマンスも低下する。
共通テーブル式(CTE式)の内部で条件を絞り込めば、行数を減らすことができ、クエリのパフォーマンスも向上する。

共通テーブル式の記述方法

共通テーブル式は下記の通り、WITH句を用いて記述する。

CTE式の別の書き方

列名を省略した書き方

上記のCTE式の書き方は、列名を省略した書き方である。

列名を省略しない書き方

CTE式は、列名を省略しない書き方もできる。

このような書き方

しかし、これはぱっと見分かりにくいし、下記ソースのように選択リストの中でAS句を使用した方が分かりやすいため、このようなCTE式の定義はなかなかしない。

また、定義した列の数とSELECT~FROM内(選択リスト)の数が異なればエラーとなる。

この二つの結果は、いずれも下図のようになる。

注意点

CTE式とIF文

CTE式の後に、例えば「SELECT」文などを書くのはエラーにはならないが、CTE式の定義の後にIF文を書くとエラーになる。
例えば「キーワード ‘IF’ 付近に不適切な構文があります。」というエラーが出る。
IF文で条件分岐を書きたいときにはCTE式は使わず、テーブル型変数一時テーブルを使う方向で考えるとよい。
または、CASE WHENでフラグ列を作って、WHERE で何とかできれば、その方向で回避することも考えるとよい。

CTE式の内容が実行するたびに変わる

これは、同じCTE式を使用している複数の箇所で、実行結果が異なるという場合。
例えば、CTE式の中ではORDER BYは使えないが、CTE式をSELECTする度にデータの並び順が変わるという現象。
これはめったに起きないが、別のデータベースのテーブルをリンクサーバー経由で取得する場合、そのようなおかしな現象が発生する場合があった。

それで都合が悪い場合は(ORDER BYが使えない場所でさらに並び順が変わってはいけない処理)、テーブル型変数一時テーブルを使うことも検討するとよい。

[スポンサードリンク]

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


ピックアップ記事

  1. コンボボックスで「全て」が選択された場合に、NULLの行も取得したい場合。 (さらに&helli…
  2. IDとパスワードでSQL Serverでログインするユーザーを作成する。 (さらに&hellip…
  3. SSRSのパラメータ入力エリアが、英語表記になった場合の対策。 (さらに…)…
  4. いまの時代、一つの企業に就職してそこで定年を迎えるというのはまれです。 しかし、それが一番いいと私…
  5. MacにEclipseをインストールする方法のまとめ (さらに…)…

カテゴリー

[スポンサードリンク]




ページ上部へ戻る