2014-08-31 131 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 ... 
相關問題