将两个表合并为一个具有相同列名的表

时间:2014-08-31 12:08:14

标签: sql postgresql create-table

我使用此命令将两个表合并为一个:

CREATE TABLE table1 AS 
SELECT name, sum(cnt)
FROM (SELECT * FROM table2 UNION ALL SELECT * FROM table3) X
GROUP BY name
ORDER BY 1;

table2table3是包含名为namecnt的列的表,但结果表(table1)的列为namesum

问题是如何更改命令以使结果表具有列namecnt

2 个答案:

答案 0 :(得分:3)

您是否尝试过此操作(请注意AS cnt)?

CREATE TABLE table1 AS SELECT name,sum(cnt) AS cnt
  FROM ...

答案 1 :(得分:2)

如果没有显式名称,函数的输出将继承Postgres中的基本函数名称。您可以使用SELECT列表中的列别名来解决此问题 - 例如@hennes already supplied

如果您需要继承具有名称和类型(以及可能更多)的所有原始列,您还可以使用单独的命令创建表:

  • 要复制仅包含姓名和数据类型的列,仍然使用CREATE TABLE AS,但添加LIMIT 0

    CREATE TABLE table1 AS
    TABLE table2 LIMIT 0;  -- "TABLE" is just shorthand for "SELECT * FROM" 
    
  • 要复制(per documentation):

      

    所有列名,其数据类型及其非空约束:

    CREATE TABLE table1 (LIKE table2);
    

    ...和可选还有默认值,约束,索引,注释和存储设置:

    CREATE TABLE table1 (LIKE table2 INCLUDING ALL);
    

    ...或者,例如,只是默认值和约束:

    CREATE TABLE table1 (LIKE table2 INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
    

然后INSERT

INSERT INTO table1 (name, cnt)
SELECT ...        -- column names are ignored