我正在尝试使用这种模式将数据从现有表插入表中:
X1 | Y1 | Z1 | X2 | Y2 | Z2
---------------------------
a | 1 | 2 | c | 5 | 6
b | 3 | 4 | d | 7 | 8
我要填充的表应具有以下架构:
X | Y | Z
--------------
a | 1 | 2
b | 3 | 4
c | 5 | 6
d | 7 | 8
如果可能的话,我应该怎么做。
提前感谢您的回复
答案 0 :(得分:1)
使用以下2条插入语句:
INSERT INTO t2 (X, Y, Z)
SELECT X1, Y1, Z1
FROM t1;
INSERT INTO t2 (X, Y, Z)
SELECT X2, Y2, Z2
FROM t1;
用源和目标表的名称替换t1
和t2
。
我相信上面的代码很容易理解。
编辑或在1个联合声明中
INSERT INTO t2 (X, Y, Z)
SELECT X1, Y1, Z1
FROM t1
UNION
SELECT X2, Y2, Z2
FROM t1;
答案 1 :(得分:0)
您可以通过从目录中获取列信息来构造sql select查询来进行动态插入。
DO $body$
DECLARE l_select TEXT;
l_tabname text := 'yourtab';
BEGIN
SELECT string_agg('SELECT '
|| cols
|| ' FROM '
|| table_name,' UNION ALL ')
INTO l_select
FROM (
SELECT table_name,
String_agg(column_name,',') cols
FROM information_schema.columns
WHERE table_name = l_tabname
GROUP BY table_name,
substr(column_name,2) )s;
EXECUTE 'INSERT INTO yourtab2 (X, Y, Z) ' || l_select ;
END
$body$;
答案 2 :(得分:0)
我将使用横向连接:
select v.x, v.y, v.z
from t cross join lateral
(values (t.X1, t.Y1, t.Z1), (t.X2, t.Y2, t.Z2)) v(x, y, z);
这应该比union all
有更好的性能,因为它只扫描数据库一次。