#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. спасибо за ответ, я пробовал это ранее, но, похоже, это не сработало, возможно, какая-то ошибка с моей стороны, позвольте мне попробовать еще раз