2016-12-05 39 views
0

我试图多次运行一个查询 - 每次都有一个关于“where”语句的略有不同的规范。 我想写一个单一的查询,并要求数据库逐步执行每个规格,并将相应的输出保存为csv.file。 我不知道如何开始。执行不同规格的PosgreSQL查询并保存结果

的基本查询如下:

SELECT 
select id, 
count(DISTINCT (a.id, c.publn_id)) as count 
from a 
join b on a.appln_id=b.appln_id 
join c on b.publn_id=c.cit_id 
left outer join d on c.publn_id=d.publn_id 
group by id 

我想运行下面的其他规格(注意在选择和组修改通过,除了那里的条件是必要的语句):

1.

SELECT 
select id, c.auth, 
count(DISTINCT (a.id, c.publn_id)) as count 
from a 
join b on a.appln_id=b.appln_id 
join c on b.publn_id=c.cit_id 
left outer join d on c.publn_id=d.publn_id 
where (c.auth='EP' or c.auth='US') 
group by id, c.auth 

2.

SELECT 
select id, d.categ, 
count(DISTINCT (a.id, c.publn_id)) as count 
from a 
join b on a.appln_id=b.appln_id 
join c on b.publn_id=c.cit_id 
left outer join d on c.publn_id=d.publn_id 
where c.auth='EP' 
and (d.categ='X' or d.categ='Y') 
group by id, d.categ 

3.

SELECT 
select id, d.categ, 
count(DISTINCT (a.id, c.publn_id)) as count 
from a 
join b on a.appln_id=b.appln_id 
join c on b.publn_id=c.cit_id 
left outer join d on c.publn_id=d.publn_id 
where c.auth='EP' 
and (d.categ='E') 
group by id, d.categ 

4.

SELECT 
select id, 
count(DISTINCT (a.id, c.publn_id)) as count 
from a 
join b on a.appln_id=b.appln_id 
join c on b.publn_id=c.cit_id 
left outer join d on c.publn_id=d.publn_id 
where c.auth='EP' 
and (d.categ!='Y' and d.categ!='X' and d.categ!='E') 
group by id 

此外,每个规范将被用于查询不同时间窗口(但我离开这些条件了现在)。

我想指定一个循环遍历所有规格的单个查询,然后自动保存结果。

+0

'UNION ALL'可能是你想要的吗?可能与'FROM'或CTE('WITH'查询)中的子查询结合? –

+0

谢谢,我不确定'UNION ALL'如何提供帮助,你能举个例子吗?我正在考虑创建一个临时表,然后用不同的条件指定不同的SELECTS。但是,我正在寻找一个解决方案,您只需指定一个基本的SELECT语句,其中包含一个包含不同条件的循环。我想得到的是每个规范的一个CSV文件:使用where =(c.auth ='EP'或c.auth ='US'),c.auth ='EP' 和( d.categ ='X'或d.categ ='Y')...,使用基本查询开始循环(应用不同的条件),之后保存文件 –

回答

1

尝试使用特殊要求COPY (SELECT ...) TO file WITH CSV HEADER;

Like this one COPY (SELECT * FROM country WHERE country_name LIKE 'A%') TO '/usr1/proj/bray/sql/a_list_countries.copy'; 只需向内部请求添加所需的所有参数并运行查询即可。

更多信息:https://www.postgresql.org/docs/current/static/sql-copy.html

+0

谢谢。使用CSV复制(选择...)到标准输出正在工作,但标准输出是必要的,否则你必须是超级用户。但我不知道结果CSV文件将保存在哪里,也不知道在哪个名称下。我怎样才能指定这个?顺便说一句,我读过,也可以使用\ COPY反斜杠,但这给了我一个错误,并没有运行。 –

+0

要输出到一个文件,你需要一个允许postgres写入的文件夹。例如在'/ tmp'中,当然最好使用普通文件夹。 我认为从另一台主机连接并输出到stdout会更舒服,重定向到本地文件。像'psql -h主机-U用户'COPY(SELECT * FROM country WHERE country_name LIKE'A%')to stdout WITH CSV HEADER'> file.csv' –

+0

'\ copy'只能在'psql'客户端中使用。 –

0

所以,每明确的意见,你想多输出文件。这是关键的缺失信息。

你不能用SQL查询来做到这一点。

可以用PL/pgSQL的过程做到这一点 - 一个函数或DO块 - 但前提是你有写权限的服务器上的文件,因为你必须使用COPY到一个指定的文件编写不同文件在LOOP。您将创建一个临时表来预先计算结果,然后使用COPY(SELECT ... FROM temptable ... WHERE ...)到'somefilename')的变体重复查询以写入结果。

否则,您需要使用客户端脚本执行此操作,因为服务器无法为单个查询中的copy ... to stdout指定所需的输出文件名,也无法分割多个copy

例如,您可以编写一个与psql一起运行的脚本,该脚本创建了temporary表,然后使用\copy来编写输出文件。

或者您可以使用perl的DBD :: Pg,Python的psycopg2或任何客户端驱动程序来查询和复制输出。

相关问题