Копировать данные таблицы с общими столбцами - PullRequest
5 голосов
/ 13 января 2012

Мне нужно скопировать данные из одной таблицы в другую. Таблицы не имеют все одинаковые столбцы или порядок; но копируемые данные всегда находятся в одних и тех же столбцах; то есть данные из столбца foo должны быть скопированы в столбцы foo.

Если бы было только двумя таблицами, я мог бы просто жестко закодировать имена столбцов, например:

INSERT INTO table_target ( column1, column2, column4 ) 
  SELECT column1, column2, column4 FROM table_source;

Однако есть пара дюжин таблиц, и необходимо выполнить какое-то дополнительное преобразование, поэтому было бы неплохо, если бы я мог просто сказать: скопировать все соответствующие столбцы и игнорировать остальные.

Мне удалось выяснить, как получить список общих столбцов, но теперь я застрял.

SELECT src.col
  FROM (SELECT COLUMN_NAME as col
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = 'table_target') as trg
INNER JOIN 
  (SELECT COLUMN_NAME as col
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = 'table_source') as src ON (src.col=trg.col)
; 

1 Ответ

2 голосов
/ 14 января 2012

Уловка, которую я использовал в прошлом, для получения хорошего результата - написать запрос, который возвращает SQL, а затем просто скопировать и вставить его в командную оболочку db. В этом случае это будет ваш запрос:

SELECT CONCAT(
    'INSERT INTO table_target (',  
    GROUP_CONCAT(trg.col), -- produces output like "col1, col2, col3"
    ') SELECT ',
    GROUP_CONCAT(trg.col), -- produces output like "col1, col2, col3"
    ' FROM table_source;') as sql_stmt
FROM (
(SELECT COLUMN_NAME as col
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'table_target') as trg
INNER JOIN 
(SELECT COLUMN_NAME as col
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'table_source') as src ON src.col=trg.col) x;

Здесь используется удобная функция mysql GROUP_CONCAT, которая объединяет значение в CSV - идеально подходит для создания списка имен столбцов для генерации SQL

Я также завернул ваш запрос в псевдоним, чтобы мы могли выбрать из него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...