CTE(共通テーブル式)共通テーブル式

T-SQLコードを記述するとき、多くの場合、あなたは一時的にいくつかの結果セットを格納する必要があります。我々はすでに広く使用され、一時的に結果セット保存するために2つの方法について説明しています:一時テーブルとテーブル変数を。また、あなたはまた、共通テーブル式を使用することができます。共通テーブル式(共通テーブル式)特性導入SQL Server2005バージョンです。CTEは、グループが、一時的な結果セットで見ることができますし、次は、SELECT、INSERT、UPDATE、DELETEこと、声明をマージすることができ、複数回参照しました。CTEは、文がより明確かつ簡潔にすることができ、共通の表現を使用してください。そして、同様の効果だけでなく、一時テーブルとテーブル変数の公共の表現。下記の3つの方法の比較。

  方法1,3の比較

   (A)、一時テーブル:ユーザーがSQL Server環境が自動的に削除されて起動すると、一時データベースtempdb内I / O操作でテーブル構造を作成する必要があります。

   (B)、テーブル変数:変数の定義と一致するテーブル構造の形でメモリに存在する、テーブルなどを用いて、I / Oを生成するために必要

   (C)、共通テーブル式:共通表式、定義を一時的オブジェクト、同様の方法およびテーブルを使用してテーブルで定義そのような変数のないI / O、必要なしに、結果セットを格納するためのメモリに記憶されます。参照を所有することができ、それはまた再びクエリで複数回参照することができます。

  2、WITH意味AS

  AS-WITHサブクエリ部分(副問合せのファクタリング)を行います。

  SQLはSQL文全体で使用されているフラグメントを、定義するために使用されます。ASので、与えられたテーブル名が二回以上呼ばれたWITH場合は一度だけ呼び出された場合、オプティマイザは自動的にASは、一時テーブルにデータを取得しますWITH、それはしません。データは、グローバル一時テーブルに強制でAS句WITH実体化することができます。

  AS WITH SQL文を使用して何回も続いてもよいが、複数のSQL文の使用を続けることはできません。

B WITH AS 
    SELECT * xxxはFROM WHERE同上> 5 SELECT * B FROM

  3、CTEの定義

   CTEが定義されている構文は、主に3つの部分を含んでいます。

   (A)、Expression_name:CTE式名。

   (二)、Column_nameの:列名リスト。

   (三)、CTE_query_definition:選択クエリの結果セットのCTEの定義

  expression_name WITH [ (column_nameに[、... N ] )]   AS    (
    cte_query_definition
  )

  CTEの利点のマイクロソフト社の説明によると、4ポイントに帰することができます。

  •   あなたは、再帰共通テーブル式(CTE)を定義することができます
  •   複数箇所を参照されたビューの結果として設定されていない場合は、CTEは、それがより簡潔にすることができます
  •   GROUP BYステートメントは、得られたスカラサブクエリ列に直接作用することができます
  •   あなたは声明の中で共通テーブル式(CTE)を複数回参照することができます

  再帰共通テーブルかどうかに応じて(CTE)の発現は、非再帰共通テーブル式と再帰共通テーブル式に分けることができます。

  非再帰共通テーブル式(CTE):

  非再帰共通テーブル式(CTE)は、クエリの結果は、外部コールの1回だけのクエリ結果セットを返します。CTEは、その定義に独自の文を呼び出すことはありません。

  使用と一貫したビューとサブクエリの非再帰共通テーブル式(CTE)。

  例えば、簡単な非再帰共通テーブル式:

WITH CTE_Test
 AS
    SELECT * FROM )PERSON_1 SELECT *をCTE_Test FROM

  共通テーブル式の利点の一つは、にすることができ、次のいずれかのステートメントを繰り返しに引用します:

コードをコピー
  WITH CTE_Test
  AS   (
      SELECT * FROM PERSON_1)   SELECT * CTE_Test FROM AS A  -への最初の参照   INNER JOIN CTE_Test AS B    -第二の基準   ON a.id = b.id   ORDER a.id BY DESC
コードをコピー

  上記は、何度も、ちょうど文を引用しながら、それが適切に実行することができます。

  に与えられているこのような複数のステートメントの参照、もし。

コードをコピー
  WITH CTE_Test
  AS   (
      SELECT * FROM )PERSON_1   SELECT * FROM CTE_Test   SELECT *をCTE_Test FROM
コードをコピー

  出力:

  

  :次のステートメントは、したがって、次必要ステートメントで参照される複数のCTE、複数定義することができ、コンマで区切られ、次の例では、定義CTE複数ある場合にCTEにのみ使用することができるので

コードをコピー
WITH CTE_Test1
 AS
SELECT * FROM PERSON_1)、CTE_Test2 ASは、SELECT * FROM )PERSON_2 SELECT * FROM CTE_Test1 UNION SELECT * CTE_Test2 FROM
コードをコピー

  結果は以下の通りであります:

  

   再帰共通テーブル式(CTE):

     再帰共通式の場合、それが唯一の文に2つの部分で定義する必要があります:

  •    基本的なステートメント
  •    再帰的な声明

     まず、下の親タブの列番号、列名、列をテーブルの列のテーブルを構築します。

   

  今、各列は、コードのいくつかの層の最初の列であるCTEクエリを使用し、以下の通りであります:

コードをコピー
WITH COL_CTE(Id,Name,ParentId,tLevel )
AS
(
    --基本语句
    SELECT Id,Name,ParentId,0 AS tLevel FROM Col WHERE ParentId = 0 UNION ALL --递归语句 SELECT c.Id,c.Name,c.ParentId,ce.tLevel+1 AS tLevel FROM COL as c INNER JOIN COL_CTE AS ce   --递归调用 ON c.ParentId = ce.Id ) SELECT * FROM COL_CTE
コードをコピー

  输出结果如下:

  

  0表示顶级栏目。1就是1级栏目。语法非常优雅。就一个SELECT * FRON COL_CTE。这正是CTE强大的地方,但是,这要有约束,否则如果无限制递归可以会消耗掉非常多的系统资源。下面来看看如何限制递归的最大次数。

  如将上面的查询语法改为:

コードをコピー
WITH COL_CTE(Id,Name,ParentId,tLevel )
AS
(
    --基本语句
    SELECT Id,Name,ParentId,0 AS tLevel FROM Col WHERE ParentId = 0 UNION ALL --递归语句 SELECT c.Id,c.Name,c.ParentId,ce.tLevel+1 AS tLevel FROM COL as c INNER JOIN COL_CTE AS ce ON c.ParentId = ce.Id ) SELECT * FROM COL_CTE OPTION(MAXRECURSION 2)  --指定最大递归次数为2
コードをコピー

  我们知道在上面的查询中,要查到天河区新闻最少要递归3次,但是现在只递归2次,运行是什么结果呢?

  

  提示信息如下:

  消息 530,级别 16,状态 1,第 1 行
  语句被终止。完成执行语句前已用完最大递归 2。

   CTEは非常にエレガントな存在です。CTEは、最大の利点は、良質のコードのいずれかでなければなりませんコードの可読性を向上させることであるもたらします。再帰CTEは、シンプルかつエレガントな方法で複雑なクエリを実現するために、より楽しいことができます。

ます。https://www.cnblogs.com/Alenliu/p/5044226.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34278190/article/details/93470066