合并两个表为一个具有相同的列名
问题描述:
我使用这个命令来合并两个表为一个:合并两个表为一个具有相同的列名
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
?
答
如果没有显式名称,函数的输出会继承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
答
你有没有试过这个(注意AS cnt
)?
CREATE TABLE table1 AS SELECT name,sum(cnt) AS cnt
FROM ...