[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. SQL Server認証ができるようにする設定方法 (さらに…)…
  2. あいまい検索での否定 ○○以外の書き方 あいまい検索での否定は「[^任意の文字・文字列]…
  3. 開始日と終了日にブランクを設定した場合の記述にも対応 (さらに…)…
  4. SUM関数を使用して累計を求める (さらに…)…
  5. 無料動画セミナー・クラスメンバとインスタンスメンバ (さらに…)…

カテゴリー

[スポンサードリンク]




ページ上部へ戻る