在Postgres(版本9.4 fwiw)中,INSERT INTO ... SELECT
查询似乎是根据列位置而不是名称插入的:
pg=# CREATE TEMPORARY TABLE x (a int, b int);
CREATE TABLE
pg=# INSERT INTO x (a, b) SELECT 1 as b, 2 as a;
INSERT 0 1
pg=# SELECT * FROM x;
a | b
---+---
1 | 2
(1 row)
有没有办法构建这个查询或类似的东西,这样列将按名称而不是位置插入?我希望这里的结果是:
pg=# SELECT * FROM x;
a | b
---+---
2 | 1
(1 row)
此处的上下文是SELECT
的内容定义在与整体INSERT
调用不同的位置,因此很难执行常见订单。
答案 0 :(得分:1)
只需将查询移动到子查询:
INSERT INTO x (a, b) SELECT a, b FROM (SELECT 1 AS b, 2 AS a) src;
答案 1 :(得分:0)
使用insert语句定义列的顺序:
INSERT INTO x (b, a)
SELECT 1 as b, -- maps to first column above
2 as a; -- maps to second column above