クエリQ1があり、次のようなクエリを実行する必要があるとします。
Q1
union
select *
from (some query that uses Q1 outcome)
私はそれをしたいと思います:
PostgreSQLでそれを行うにはどうすればよいですか?
これには、共通テーブル式を使用できます。
WITH q1 AS
( SELECT ... )
SELECT *
FROM q1
UNION
SELECT *
FROM (some query that uses q1 outcome)
;
あるいは:
WITH q1 AS
( SELECT ... )
TABLE q1
UNION
SELECT *
FROM (some query that uses q1 outcome)
;
複数のCTEを順番に使用することもできます。
WITH q1 AS
( SELECT ... )
, q2 AS
(some query that uses q1 outcome)
, q3 AS
(some other query that uses q1 and/or q2 outcome)
SELECT *
FROM q1
UNION
SELECT *
FROM q2
UNION
SELECT q3.*
FROM q2 JOIN q3 ON ...
;
ビューは作成されず、Q1クエリを2回実行することもありません。これは、実装によって異なります。実際に実行されるパスは、オプティマイザーと他のいくつかの要因によって異なります。クエリはよりコンパクトでエレガントですが、拡張するよりも効率的であるとは限りません。