如何从具有相同列路径的另一个表填充表

时间:2018-11-15 16:45:41

标签: sql database postgresql

我正在尝试使用这种模式将数据从现有表插入表中:

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

如果可能的话,我应该怎么做。

提前感谢您的回复

3 个答案:

答案 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;

用源和目标表的名称替换t1t2
我相信上面的代码很容易理解。
编辑或在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$;

Demo

答案 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有更好的性能,因为它只扫描数据库一次。