执行具有不同规范的PostgreSQL查询并保存结果

时间:2016-12-05 09:51:20

标签: postgresql

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

基本查询如下:

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

我想运行以下附加规范(请注意除where条件之外所需的select和group by语句中的修改):

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  

此外,将针对不同的时间窗口查询每个规范(但我暂时不考虑这些条件)。

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

2 个答案:

答案 0 :(得分:1)

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

喜欢这个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

答案 1 :(得分: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或任何客户端驱动程序来查询和复制输出。