「SQL Server - WITH」の版間の差分

提供: MochiuWiki : SUSE, EC, PCB

ページの作成:「== 概要 == <code>WITH</code>句があるSQL文は、その後に記述されている<code>SELECT</code>文よりも先に実行される。<br> <code>WITH</code>句は…」
 
29行目: 29行目:
<br><br>
<br><br>


== WITH句を使用する ==
== WITH句を使用する場合 ==
下表に示すテーブルがある。<br>
下表に示すテーブルがある。<br>
<center>
<center>
64行目: 64行目:
  Name    Date    Sales
  Name    Date    Sales
  A        20210101 200
  A        20210101 200
<br>
<br><br>
 
== WITH句の値が複数の場合 ==
<code>WITH</code>句の値が複数でも指定できる。<br>
<code>WITH</code>句の値が複数でも指定できる。<br>
以下の例では、<code>WITH</code>句で複数の値を取得した後、8行目の<code>IN</code>句の条件にしている。<br>
以下の例では、<code>WITH</code>句で複数の値を取得した後、8行目の<code>IN</code>句の条件にしている。<br>
82行目: 84行目:
  A        20210101 200
  A        20210101 200
  B        20210102 150
  B        20210102 150
<br><br>
== WITH句を使用しない場合 ==
下表に示すテーブルがある。<br>
<center>
{| class="wikitable" style="background-color:#fefefe;"
|+ T_Sampleテーブル
|-
| style="background-color:#66CCFF;" | Name
| style="background-color:#66CCFF;" | Date
| style="background-color:#66CCFF;" | Sales
|-
| A || 20210101 || 200
|-
| B || 20210102 || 150
|-
| C || 20210103 || 100
|}
</center>
<br>
<code>FROM</code>句の箇所にある副問い合わせを使用して、レコードを抽出する。<br>
<syntaxhighlight lang="sql">
SELECT b.Name, b.Date, b.Sales
FROM
(
    SELECT AVG(Sales) AS SalesAverage FROM T_Sample
) a, T_Sample b
WHERE a.SalesAverage < b.Sales;
</syntaxhighlight>
<br>
4行目は、Salesカラムの平均を求める副問い合せであり、副問い合わせの結果をテーブル(ビュー)のように使用している。<br>
1つ目の<code>FROM</code>句の中に、SQL文が記述されているため、<code>WITH</code>句より可読性が落ちている。<br>
<br>
結果は、以下の通りである。<br>
Name    Date    Sales
A        20210101 200
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:SQL_Server]]
[[カテゴリ:SQL_Server]]

2021年6月13日 (日) 14:39時点における版

概要

WITH句があるSQL文は、その後に記述されているSELECT文よりも先に実行される。
WITH句は、共通テーブル式またはCTE(Common Table Expression)とも呼ばれる。

WITH句のメリットは、FROM句の箇所にあるSQL文が外に出るため、可読性が上がることである。

※注意
WITH句は、MySQLの古いバージョンでは未対応である。

以下の例は、WITH句を使用している。

 WITH <変数1> as
 (
    SELECT <カラム名> FROM <テーブル名>
    WHERE <条件>
 )
 SELECT <カラム名>
 FROM <テーブル名>, <変数1>
 WHERE <条件>;


WITH句の後にある<変数1>は、SQL文で使用する変数である。
その後の括弧内にSQL文を記述する。

2つ目のFROM句の箇所に、WITH句の後にある<変数1>を指定している。

これにより、WITH句の後にあるSQL文をテーブル(ビュー)のように使用できる。
これは、FROM句の箇所に記述する副問い合わせと同様の意味となる。


WITH句を使用する場合

下表に示すテーブルがある。

T_Sampleテーブル
Name Date Sales
A 20210101 200
B 20210102 150
C 20210103 100


以下の例では、WITH句を使用してデータを抽出している。

 WITH T_Test as
 (
    SELECT AVG(Sales) AS SalesAverage FROM T_Sample
 )
 SELECT b.Name, b.Date, b.Sales
 FROM T_Test a, T_Sample b
 WHERE a.SalesAverage < b.Sales;


1行目は、WITH句の後のT_Testは、AS句の後にあるSQL文の名前である。
6行目は、1行目で定義したT_Testを、テーブル(ビュー)のように使用している。

結果は、以下の通りである。

Name     Date     Sales
A        20210101 200



WITH句の値が複数の場合

WITH句の値が複数でも指定できる。
以下の例では、WITH句で複数の値を取得した後、8行目のIN句の条件にしている。

 WITH T_Test as
 (
    SELECT Sales FROM T_Sample
    WHERE Sales > 100
 )
 SELECT b.Name, b.Date, b.Sales
 FROM T_Test a, T_Sample b
 WHERE b.Sales in (a.Sales);


結果は、以下の通りである。

Name     Date     Sales
A        20210101 200
B        20210102 150



WITH句を使用しない場合

下表に示すテーブルがある。

T_Sampleテーブル
Name Date Sales
A 20210101 200
B 20210102 150
C 20210103 100


FROM句の箇所にある副問い合わせを使用して、レコードを抽出する。

 SELECT b.Name, b.Date, b.Sales
 FROM
 (
    SELECT AVG(Sales) AS SalesAverage FROM T_Sample
 ) a, T_Sample b
 WHERE a.SalesAverage < b.Sales;


4行目は、Salesカラムの平均を求める副問い合せであり、副問い合わせの結果をテーブル(ビュー)のように使用している。
1つ目のFROM句の中に、SQL文が記述されているため、WITH句より可読性が落ちている。

結果は、以下の通りである。

Name     Date     Sales
A        20210101 200