根据 "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()
调用中。)
我有一个数据管道,可以从 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()
调用中。)