2016-12-05 2 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.

また

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を指定することを考えています。しかし、異なる条件を含むループを持つ1つの基本SELECT文しか指定しないソリューションを探していました。私が得たいのは、各仕様のためのCSVファイルが1つあります。条件付きループでループを指定するには、where =(c.auth = 'EP'またはc.auth = 'US')、c.auth = 'EP' および( d.categ = 'X'またはd.c​​ateg = 'Y')...、基本クエリを使用してループを開始し(異なる条件を適用する)、後でファイルを保存します –

答えて

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

+0

ありがとうございます。 STDOUT WITH CSV(COPY(SELECT ...))は機能していますが、STDOUTが必要です。そうでないと、スーパーユーザーでなければならないからです。しかし、結果のCSVファイルがどこに保存されるのかわからないし、どの名前で知っているのか分からない。これをどのように指定できますか?ところで、\ COPYをバックスラッシュで使うこともできますが、これは私にエラーをもたらし、実行されません。 –

+0

ファイルに出力するには、postgresが書き込むことができるフォルダが必要です。たとえば、 '/ tmp'では、もちろん普通のフォルダを使うのが良いでしょう。 別のホストから接続してstdoutに出力し、ローカルファイルにリダイレクトするほうが快適だと思います。 'psql -h host -U user 'のように' CSV HEADERでstdoutにコピーする '(SELECT * FROM country WHERE country_name LIKE' A% ')'> file.csv' –

+0

' \ copy'は 'psql'クライアントでのみ動作します。 –

0

、コメントを明確にあたり、あなたは複数の出力ファイルをしたいです。それは重要な欠落情報でした。

これはSQLクエリでは実行できません。

あなたはにPL/pgSQLの手順でそれを行うことができます - あなたが別の書き込みにという名前のファイルにCOPYを使用する必要があるため、しかし、あなたは、サーバー上のファイルを書き込む権限を持っている場合にのみ - 機能やDOブロックをLOOP内のファイル結果を前もって計算し、次に `COPY(SELECT ... FROM temptable ... WHERE ...)TO 'のようなものを使って結果を書き出すために一時テーブルを作成します。

それ以外の場合は、サーバーがcopy ... to stdoutの出力ファイル名を指定する方法がなく、複数のcopyを1つのクエリ内で分割する方法がないため、クライアント側のスクリプトで行う必要があります。

たとえば、temporaryテーブルを作成したpsqlで実行するスクリプトを作成し、\copyを使用して出力ファイルを書き込むことができます。

また、perlのDBD :: Pg、Pythonのpsycopg2、または出力を照会してコピーするクライアントドライバを使用できます。

関連する問題