根据 "with query" 的结果创建临时 table

creating a temporary table from the results of a "with query"

我有一个数据管道,可以从 Postgres 中提取一堆数据并将其推送到数据显示工具中。我的典型流程如下所示,并且运行良好:

create temporary table foo as 
select w.id, w.name, w.created_at
from waldo w;
\copy "foo" to './foo.txt';

然后我使用那个转储出来的 foo.txt 文件。 (实际查询要复杂得多,并且会在其他十几个 table 上进行连接和分组,但您明白了。)

我开发了一个使用 "with query" 的查询,但我无法弄清楚将结果放入文本文件的语法。此查询 运行 在我的交互式 SQL window 中很好:

WITH daze 
     AS (SELECT ( CURRENT_DATE - b.offs ) AS date 
         FROM   (SELECT Generate_series(0, CURRENT_DATE - '2015-01-15', 1) AS 
                        offs) 
                AS b) 
select w.id, w.name, w.created_at               
from waldo w, daze d
where d.date + 1 > w.created_at

但我需要将它放入我的日常转储脚本中,并获得一个我可以转储的临时 table 对象。而这段代码不 运行:

create temporary table foo as 
WITH daze 
     AS (SELECT ( CURRENT_DATE - b.offs ) AS date 
         FROM   (SELECT Generate_series(0, CURRENT_DATE - '2015-01-15', 1) AS 
                        offs) 
                AS b) 
select w.id, w.name, w.created_at               
from waldo w, daze d
where d.date + 1 > w.created_at

我苦恼的语法是什么?提前致谢。

抱歉,我不了解 Postgres,只了解 TSQL,但您可以尝试在 "daze" 下的同一 WITH?

声明另一个 CTE

此页面表示在 Postgres 语法中是可能的。 http://www.postgresql.org/docs/9.1/static/queries-with.html

WITH daze 
     AS (SELECT ( CURRENT_DATE - b.offs ) AS date 
         FROM   (SELECT Generate_series(0, CURRENT_DATE - '2015-01-15', 1) AS 
                        offs) 
                AS b)
    ,foo
     as (select w.id, w.name, w.created_at 
         from waldo w, daze d
         where d.date + 1 > w.created_at)
select * from foo

你的整个 CTE 是一种非常复杂的做事方式:

generate_series(CURRENT_DATE::timestamp, '2015-01-15'::timestamp, interval '-1 day') AS date

那么为什么不简单地:

CREATE TEMPORARY TABLE foo AS 
  SELECT w.id, w.name, w.created_at               
  FROM waldo w,
       generate_series((CURRENT_DATE + 1)::timestamp, '2015-01-16'::timestamp, interval '-1 day') AS d(date)
  WHERE d.date > w.created_at;

(请注意,WHERE 子句中的 + 1 被吸收到 generate_series() 调用中。)