使用SELECT插入仅列的子集和列顺序

问题描述

问题:我想将dummy_data_temp中存在(但不存在)的行插入dummy_data中。 dummy_data由10列组成,dummy_data_temp仅是这些列的子集(4个,这4列在dummy_data中具有列索引2、6、9、10。)。为此,我使用下面的查询

运行此命令时,出现以下错误

警告:postgresqlExecStatement中的错误:RS-DBI驱动程序:(无法检索结果:错误:列“ XXX”的类型为双精度,但表达式的类型为文本

LINE 1: INSERT INTO dummy_data SELECT dummy_data_temp.* FROM dummy_d...
                                      ^
HINT:  You will need to rewrite or cast the expression.`

问题:是否可以通过名称引用插入所选的列,或者dummy_data_temp是否必须始终与dummy_data包含相同的列(以及列顺序)?

INSERT INTO dummy_data 
SELECT dummy_data_temp.* 
FROM dummy_data_temp 
LEFT OUTER JOIN dummy_data ON (dummy_data.id=dummy_data_temp.id) 
WHERE (dummy_data.id IS NULL)

解决方法

只需指定目标列和源列:

INSERT INTO dummy_data (column_2,column_6,column_9,column_10)
SELECT t.col4,t.col2,t.col1,c.col3
FROM dummy_data_temp t
  LEFT OUTER JOIN dummy_data dd ON dd.id = t.id
WHERE dd.id IS NULL;

(尽管“不存在”条件可能更有效)