Как я могу заполнить таблицу из другой таблицы с таким же путем столбца - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь вставить данные в таблицу из существующей таблицы с этой схемой:

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 голосов
/ 15 ноября 2018

Вы можете выполнить динамическую вставку, создав запрос 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$;

Демо

0 голосов
/ 15 ноября 2018

Я бы использовал боковое соединение:

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, потому что он сканирует базу данных только один раз.

0 голосов
/ 15 ноября 2018

Используйте эти 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...