我试图多次运行一个查询 - 每次都有一个关于“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
此外,将针对不同的时间窗口查询每个规范(但我暂时不考虑这些条件)。
我想指定一个循环遍历所有规范的单个查询,然后自动保存结果。
答案 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或任何客户端驱动程序来查询和复制输出。