PostgreSQLスキルアップノート(自己啓発のための個人サイト)

WITH問い合わせ(共通テーブル式・CTE)基本


【一覧に戻る】
自己都合によりマニュアルへのリンクは9.2としています。ご了承下さい。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■■■ PostgreSQL スキルアップノート
■■■■
■◆■■ WITH問い合わせ(共通テーブル式・CTE)基本
■■■■
■■■■
■■■■ 2013/02/03
■■■■ 使用環境:PostgreSQL9.1.7 (CentOS6.2)
                                                                   (C) 2013 ohdb
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


【マニュアル】

WITH問い合わせ(共通テーブル式)→●[マニュアル]


【参考記事】

新しい業界標準「SQL99」詳細解説 →●[記事]

Oracle11gでの対応状況→●[記事]


【用語等】

WITH問い合わせ/共通テーブル式/CTE ともに同じ意味




■1■ 概要
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

WITH問い合わせ(共通テーブル式またはCTEともいう)は、ひとつのSQL文専用に
その場限りの一時テーブルを作成した上で、目的のSQLを実行する方法。

WITH句の中で一時テーブルを定義し、その後の主問い合わせ(SELECT文など処理本体)
でそれを使う。

なお、WITH句の中にはSELECTだけでなくINSERT、UPDATE、DELETEも可能。


【参考】一時テーブル

マニュアルではWITH問い合わせで作成されるものを「一時テーブル」と呼んでいるが、
普通、「一時テーブル」といえば以下のものなので注意。

一時テーブル→●[マニュアル]
一時テーブル→●[マニュアル]




■2■ 基本
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

以下は記述方法を説明するだけの意味のない内容になっているが、
実際には1個のSELECT文の中に同じ問い合わせを繰り返しするような用途などで用いる。


【□】 準備

DROP TABLE t1;CREATE TABLE t1 (c1 int,c2 int);INSERT INTO t1 values (1,1000),(2,2000),(3,3000);


【□】 基本(処理内容に意味はありません)

WITH tmp1 AS (
        SELECT * from t1 where c1>1
    ) 
SELECT * from tmp1;


 c1 |  c2
----+------
  2 | 2000
  3 | 3000
(2 行)


・・・この例では、SELECTした結果をtmp1という表に収め、それを主問い合わせの中でSELECTしている。
   上の例では意味はないが、主問い合わせの中で「tmp1」を繰り返し使うような場合などに効果的。
   (性能面でのメリットではなく、簡潔な記述になる。)



【□】 テーブルを2つ使う(処理内容に意味はありません)


WITH tmp1 AS (
         SELECT * from t1 where c1>1
     ), 
     tmp2 AS (
         SELECT * from tmp1 where c1>2
     )
SELECT * from tmp2;


 c1 |  c2
----+------
  3 | 3000
(1 行)


・・・この例では、SELECTした結果を「tmp1」、さらに「tmp1」をSELECTした結果を「tmp2」に収め、
      それを主問い合わせの中でSELECTしている。




■3■ 再帰(WITH RECURSIVE)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


【□】 基本

WITH RECURSIVE tmp(c1) AS (
  SELECT 1 
  UNION ALL 
  SELECT c1+1 FROM tmp WHERE c1 < 10
)
SELECT * FROM tmp;


database1-# SELECT * FROM tmp;
 i
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 行)



・・・「tmp」はカラム1個(c1)のテーブル
      再帰的にWHERE条件に達するまで処理を行い、その結果を主問い合わせの中で利用している。






以上 
inserted by FC2 system