2014-08-31 181 views
0

我使用这个命令来合并两个表为一个:合并两个表为一个具有相同的列名

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

如果没有显式名称,函数的输出会继承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 
3

你有没有试过这个(注意AS cnt)?

CREATE TABLE table1 AS SELECT name,sum(cnt) AS cnt 
    FROM ... 
相关问题