我使用此命令将两个表合并为一个:
CREATE TABLE table1 AS
SELECT name, sum(cnt)
FROM (SELECT * FROM table2 UNION ALL SELECT * FROM table3) X
GROUP BY name
ORDER BY 1;
table2
和table3
是包含名为name
和cnt
的列的表,但结果表(table1
)的列为name
和sum
。
问题是如何更改命令以使结果表具有列name
和cnt
?
答案 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