WITH修飾子の共通テーブル式(CTE)は、CTEが間接的に自己参照を行なわない場合、WITH修飾子で定義された先行するCTEまたは後続のCTEを参照できます。つまり、循環参照は許可されません。CTEは、名前付きクエリーとも呼ばれます。
この例では、テーブルの定義は次のとおりです。
CREATE TABLE orders (customer_id INTEGER, total_cost FLOAT);
これらの文は、テーブルにデータの行を挿入します。
INSERT INTO orders (43563, 734.12); INSERT INTO orders (65758, 211.15); INSERT INTO orders (23235, 1264.98); INSERT INTO orders (43563, 583.23); INSERT INTO orders (89786, 278.66); INSERT INTO orders (13253, 401.97); INSERT INTO orders (98765, 1042.23); INSERT INTO orders (23235, 699.23); INSERT INTO orders (43563, 935.35); INSERT INTO orders (88354, 375.09);
この例のWITH修飾子にはmultiple_order_totalsとして指定された非再帰的共通テーブル式(CTE)が含まれており、WITH句で以前に定義されたmultiple_ordersテーブルを参照します。
WITH multiple_orders AS ( SELECT customer_id, COUNT(*) AS order_count FROM orders GROUP BY customer_id HAVING COUNT(*) > 1 ), multiple_order_totals AS ( SELECT customer_id, SUM(total_cost) AS total_spend FROM orders WHERE customer_id IN (SELECT customer_id FROM multiple_orders) GROUP BY customer_id ) SELECT * FROM multiple_order_totals ORDER BY total_spend DESC;
この問合わせは、以下のような応答セットを返します。
customer_id | total_spend |
---|---|
43563 | 2.25270000000000E 003 |
23235 | 1.96421000000000E 003 |
この例のWITH修飾子にはmultiple_order_totalsとして指定された非再帰的共通テーブル式(CTE)が含まれており、WITH句でそれ以降に定義されたmultiple_ordersテーブルを参照します。
WITH multiple_order_totals AS ( SELECT customer_id, SUM(total_cost) AS total_spend FROM orders WHERE customer_id IN (SELECT customer_id FROM multiple_orders) GROUP BY customer_id ), multiple_orders AS ( SELECT customer_id, COUNT(*) AS order_count FROM orders GROUP BY customer_id HAVING COUNT(*) > 1 ) SELECT * FROM multiple_order_totals ORDER BY total_spend DESC;
この問合わせは、以下のような応答セットを返します。
customer_id | total_spend |
---|---|
43563 | 2.25270000000000E 003 |
23235 | 1.96421000000000E 003 |