web-dev-qa-db-ja.com

ビューを作成せずに繰り返しを回避する

クエリQ1があり、次のようなクエリを実行する必要があるとします。

Q1
union
select *
from (some query that uses Q1 outcome)

私はそれをしたいと思います:

  • ビューを作成せずに
  • Q1クエリを2回実行せずに。

PostgreSQLでそれを行うにはどうすればよいですか?

3
Aslan986

これには、共通テーブル式を使用できます。

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回実行することもありません。これは、実装によって異なります。実際に実行されるパスは、オプティマイザーと他のいくつかの要因によって異なります。クエリはよりコンパクトでエレガントですが、拡張するよりも効率的であるとは限りません。

6
ypercubeᵀᴹ