Как объединить несколько таблиц вместе в postgresql, которые имеют одинаковые столбцы, но в разном порядке?

#postgresql #merge #insert

#postgresql #слияние #вставить

Вопрос:

У меня есть несколько таблиц, в которых все имеют одинаковые столбцы, но в разном порядке. Я хочу объединить их все вместе. Я создал пустую таблицу со стандартными столбцами в том порядке, в котором я хотел бы. Я пробовал вставлять с

 insert into master_table select * from table1;
  

но это не работает из-за разного порядка столбцов — некоторые значения попадают не в те столбцы. Каков наилучший способ создать одну таблицу из них всех в порядке, указанном в моей пустой основной таблице?

Ответ №1:

Если вы имеете дело со многими столбцами и множеством таблиц, вы можете использовать information_schema для получения столбцов. Вы можете перебрать все таблицы, из которых хотите вставить, и запустить это в процедуре plpgsql, заменив table1 переменной:

 EXECUTE (
SELECT
'insert into master_table
    (' || string_agg(quote_ident(column_name), ',') || ')
 SELECT ' || string_agg('p.' || quote_ident(column_name), ',') || '
 FROM   table1 p '
 FROM   information_schema.columns raw
 WHERE  table_name  = 'master_table');
  

Комментарии:

1. Выглядит хорошо, но, похоже, где-то не хватает закрывающей скобки ) . [все еще подсчитываю …]

2. вы правы — тот, что в самом конце, для завершения execute(), отредактированный ответ

3. также добавлены кавычки вокруг ‘master_table’, поскольку это строковое значение в таблице information_schema

4. Кстати: вы можете избежать множества цитирований и || забот, используя format() функцию.

Ответ №2:

просто укажите правильный порядок в select

вместо

   select *
  

если вы хотите, чтобы 3 поля находились во второй позиции.

   select field1, field3, field2
  

или вы можете использовать sintaxis ВСТАВКИ

  INSERT INTO master_table (field1, field3, field2)
     SELECT *
  

Комментарии:

1. спасибо за ответ, я пробовал это ранее, но, похоже, это не сработало, возможно, какая-то ошибка с моей стороны, позвольте мне попробовать еще раз