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

提供: MochiuWiki : SUSE, EC, PCB

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の1版が非表示)
9行目: 9行目:
<br>
<br>
以下の例は、<code>WITH</code>句を使用している。<br>
以下の例は、<code>WITH</code>句を使用している。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="tsql">
  WITH <変数1> as
  WITH <変数1> as
  (
  (
     SELECT <カラム名> FROM <テーブル名>
     SELECT <カラム名> FROM <テーブル名>
     WHERE <条件>
     WHERE <条件>
  )
  )
  SELECT <カラム名>
  SELECT <カラム名>
121行目: 121行目:
  A        20210101 200
  A        20210101 200
<br><br>
<br><br>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


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

2024年11月26日 (火) 22:03時点における最新版

概要

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