Sql 博士后聚集

Sql 博士后聚集,sql,postgresql,postgresql-9.1,postgresql-9.2,Sql,Postgresql,Postgresql 9.1,Postgresql 9.2,我在postgres中有3个表格,其中包含以下表格信息: <id, column1, column2, column3> 现在,我打算根据id聚合这3个表,以便具有相同id的所有行都显示在一起。在有3张表格的研究生中这样做可行吗。我还打算将集群ID存储在一个单独的文本文件中 我知道如何使用1个表进行聚类,但我不知道如何使用postgres中的3个表进行聚类。此外,我不确定是否可以将聚合行放入文件中。我在谷歌上搜索了诸如“postgres将聚合行放入文本文件”之类的关键词,但没有

我在postgres中有3个表格,其中包含以下表格信息:

<id, column1, column2, column3>

现在,我打算根据id聚合这3个表,以便具有相同id的所有行都显示在一起。在有3张表格的研究生中这样做可行吗。我还打算将集群ID存储在一个单独的文本文件中

我知道如何使用1个表进行聚类,但我不知道如何使用postgres中的3个表进行聚类。此外,我不确定是否可以将聚合行放入文件中。我在谷歌上搜索了诸如“postgres将聚合行放入文本文件”之类的关键词,但没有得到合适的结果

谁能帮我一下吗。我也是博士后的新人,请原谅

例如,我的输入是:

 #@<id1> <moon> <diamter> <x>
 #@<id1> <moon> <closest_to> earth>
#@
#@地球>
现在我想做以下工作:

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

也就是说,我希望按id分组,并将上述按结果分组的结果存储在一个文件中。在研究生中这样做可行吗。如果是..那么如何?

您可以
将表连接在一起:

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的命令似乎可以做到这一点。您可能必须将查询结果存储在一个表中。

如果您想从三个表中获取所有值,但不知道每个表中每个id有多少行,您可以
联合它们:

    SELECT id, col1, col2, col3
    FROM tab1
    UNION
    SELECT id, col1, col2, col3
    FROM tab2
    UNION
    SELECT id, col1, col2, col3
    FROM tab3
这样,您就可以使用
string\u 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;
至少,您可以将结果复制到文件中。基本上有两种方法。首先是从应用程序中执行此操作,这很好,因为它很容易发送给用户(是否有用户?)。另一种方法是使用
COPY
命令,该命令会将结果保存在数据库服务器上,SO的用户
postgres
应该具有在所需路径上写入的权限(或者您可以使用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
(这也有更好的性能)。

一些输入/输出示例将阐明question@Andomar我已经编辑了我的问题,例如输入和输出。感谢回复请定义“集群”。这个词可以指很多事情。另外:您的任何列都可以为NULL或空(“”)?在这个问题中,表似乎有不同的列类型(f.e.“”vs“earth>”),如果是这样的话,您就不能在不强制使用相同类型的情况下使用并集。@Andomar,她没有提到列数据类型。。。所以没有办法确定(应该问她)。但如果是问题,我们可以将它们转换为相同的数据类型(如文本),这可以保存到文件中。