1

次の形式の情報を含むpostgresに3つのテーブルがあります。

<id, column1, column2, column3>

ここで、同じ ID を持つすべての行が一緒に表示されるように、ID に基づいて 3 つのテーブルを集約するつもりです。3つのテーブルを持つpostgresでこれを行うことは可能ですか? また、クラスター化された ID を別のテキスト ファイルに保存する予定です。

1 つのテーブルを使用してクラスタリングを行う方法は知っていますが、postgres で 3 つのテーブルを使用してクラスタリングを行う方法がわかりません。また、集計された行をファイルに入れることができるかどうかもわかりません。「postgres 集約行をテキストファイルに入れる」などのキーワードでググったのですが、適切な結果が得られませんでした。

誰かがこれで私を助けてくれませんか。また、私はpostgresが初めてなので、すみません。

たとえば、私の入力は次のとおりです。

 #@<id1> <moon> <diamter> <x>
 #@<id1> <moon> <closest_to> earth>

今、私は次のことをしたい:

 #@<id1> <moon> <diameter> <x>, <moon> <closest_to> <earth>

つまり、GROUPBY id を使用して、上記の結果をグループ化してファイルに保存します。postgresでこれを行うことは可能ですか。はいの場合..どうやって?

4

2 に答える 2

3

3 つのテーブルからすべての値を取得したいが、各 id に対して各テーブルに含まれる行数がわからない場合は、次のようにUNIONします。

    SELECT id, col1, col2, col3
    FROM tab1
    UNION
    SELECT id, col1, col2, col3
    FROM tab2
    UNION
    SELECT id, col1, col2, col3
    FROM tab3

それを使用string_aggして、結果を連結し、ほとんど読み取りを行ってファイルに移動できます。

SELECT id, string_agg(col1 || ' ' || col2 || ' ' || col3, ', ')
FROM (
        SELECT id, col1, col2, col3
        FROM tab1
        UNION
        SELECT id, col1, col2, col3
        FROM tab2
        UNION
        SELECT id, col1, col2, col3
        FROM tab3
) AS tbls
GROUP BY id;

少なくとも、結果をファイルにコピーできます。基本的に、2つの方法があります。1 つ目は、アプリケーションからそれを行うことです。これは、ユーザーに簡単に送信できるため、優れています (ユーザーはいますか?)。もう 1 つは、COPYコマンドを使用することです。これには、データベース サーバーに結果が保存されるという問題がpostgresあり、SO のユーザーには、目的のパスに書き込む権限が必要です (または、権限を psql\copyまたはアプリでラップすることができます)。 )。

コピーは次のようになります。

COPY (
    SELECT '#@' || id || ' ' || string_agg(col1 || ' ' || col2 || ' ' || col3, ', ')
    FROM (
            SELECT id, col1, col2, col3
            FROM tab1
            UNION
            SELECT id, col1, col2, col3
            FROM tab2
            UNION
            SELECT id, col1, col2, col3
            FROM tab3
    ) AS tbls
    GROUP BY id
) TO '/tmp/yourfile.txt';

OBS: を使用したことに注意してくださいUNION。これにより、テーブル間で繰り返される値が抑制されます。それが望ましくない場合、または繰り返し値がない場合 (確かに)UNION ALL代わりに使用してください (パフォーマンスも向上します)。

于 2013-03-02T10:44:02.097 に答える
0

joinテーブルを一緒にすることができます:

select  coalesce(t1.id,t2.id,t3.id) as id
,       t1.col1
,       t1.col2
,       t2.col3
,       t3.col4
from    Table1 t1
full outer join
        Table2 t2
on      t1.id = t2.id
full outer join
        Table3 t3
on      t3.id = coalesce(t1.id, t2.id)

ファイルへの書き込みに関しては、Postgres のCOPYコマンドでできるようです。クエリ結果をテーブルに格納しなければならない場合があります。

于 2013-03-02T08:30:19.113 に答える