【发布时间】:2017-01-19 09:37:03
【问题描述】:
我希望在 PostgreSQL 中将一组列从一个表动态插入到另一个表中。我想我想做的是读入列标题的“清单”(表1中存在的那些列-存储表),如果它们存在于导出表(表2)中,则将它们全部插入立即从表 1 中。虽然表 2 的列将是可变的 - 一旦导入将删除它并导入新数据以使用可能不同的列结构导入。所以我需要根据列名来导入。
例如
表 1. - 存储表
ID NAME YEAR LITH_AGE PROV_AGE SIO2 TIO2 CAO MGO COMMENTS
1 John 1998 2000 3000 65 10 5 5 comment1
2 Mark 2005 2444 3444 63 8 2 3 comment2
3 Luke 2001 1000 1500 77 10 2 2 comment3
表 2. - 导出表
ID NAME MG# METHOD SIO2 TIO2 CAO MGO
1 Amy 4 Method1 65 10 5 5
2 Poe 3 Method2 63 8 2 3
3 Ben 2 Method3 77 10 2 2
如您所见,导出表可能包含存储表中不存在的列,因此这些将被忽略。
我想一次插入所有这些列,因为我发现如果我按列单独执行它会扩展每次插入时的行数(也许有人可以解决这个问题?目前我已经编写了一个函数来检查表 2 中是否存在列名,如果存在,则插入它,但正如所说,这每次都会扩展表的行,并将其余列设为 NULL)。 我的函数中的 INSERT 行:
EXECUTE format('INSERT INTO %s (%s) (SELECT %s::%s FROM %s);',_tbl_import, _col,_col,_type,_tbl_export);
作为我的问题的一种“代码示例”:
EXECUTE FORMAT('INSERT INTO table1 (%s) (SELECT (%s) FROM table2)',columns)
其中“列”是一些变量,表示导出表中存在的需要进入存储表的列。这将是可变的,因为表 2 每次都会有所不同。
理想情况下,这会将表 1 更新为:
ID NAME YEAR LITH_AGE PROV_AGE SIO2 TIO2 CAO MGO COMMENTS
1 John 1998 2000 3000 65 10 5 5 comment1
2 Mark 2005 2444 3444 63 8 2 3 comment2
3 Luke 2001 1000 1500 77 10 2 2 comment3
4 Amy NULL NULL NULL 65 10 5 5 NULL
5 Poe NULL NULL NULL 63 8 2 3 NULL
6 Ben NULL NULL NULL 77 10 2 2 NULL
【问题讨论】:
标签: postgresql plpgsql dynamic-sql