Как объединить несколько таблиц mysql в одну? - PullRequest
2 голосов
/ 16 сентября 2011

У меня есть Mysql DB со 121 таблицей, с другой структурой, и мне нужно объединить все эти таблицы в 1 таблицу.

Есть 3 поля, которые одинаковы во всех таблицах (email, base_name, location), но все остальные поля в некоторых таблицах одинаковы, в других нет.

Существует ли какая-либо стена для объединения таблиц и сохранения всех полей (не имеет значения, есть ли пустые поля)?

Ответы [ 3 ]

2 голосов
/ 16 сентября 2011

Сначала вам нужно будет вручную создать таблицу, в которой есть все уникальные столбцы во всех ваших таблицах, поставить первичный ключ по электронной почте, base_name, location.

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

Вы можете сгенерировать оператор вставки для каждой из ваших таблиц, выполнив следующие запросыпредоставит вам список столбцов для выбора, сравнив table1 с новой таблицей и обновляемыми столбцами (если не пустыми).

(измените номер таблицы ниже, чтобы сгенерировать данные для каждой из ваших таблиц)

SELECT GROUP_CONCAT(NVL(b.COLUMN_NAME,CONCAT('NULL AS ',a.column_name))) as sel_cols
  FROM INFORMATION_SCHEMA.COLUMNS a
  LEFT JOIN INFORMATION_SCHEMA.COLUMNS b ON a.column_name = b.column_name and b.table_name='table1' and b.table_schema = b.table_schema
  WHERE a.table_name = 'new_table' AND b.table_schema = database()

для получения списка обновляемых столбцов

SELECT GROUP_CONCAT(CASE WHEN b.column_name IS NOT NULL THEN CONCAT(b.column_name,'=VALUES(',b.column_name,')') ELSE END) as upd_cols
  FROM INFORMATION_SCHEMA.COLUMNS a
  LEFT JOIN INFORMATION_SCHEMA.COLUMNS b ON a.column_name = b.column_name and b.table_name='table1' and b.table_schema = b.table_schema
  WHERE a.table_name = 'new_table' AND b.table_schema = database()

Например:

col1, col2, NULL as col3

col1 = VALUES(col1), col2 = VALUES(col2)

теперь вставьте список столбцов и имя таблицы во вставку..

INSERT INTO new_table (select col1,col2,NULL as col3 FROM table1)
ON DUPLICATE KEY UPDATE col1 = VALUES(col1), col2 = VALUES(col2)

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

возможно, поставить столбец, которыйпокажет тот факт, что произошла перезапись и откуда исходный столбец, так что вы можете вручную разрешить конфликт

1 голос
/ 16 сентября 2011

Я не знаю, правильно ли я понял, но я думаю, что вы ищете объединение таблиц, а не объединение их (извините, если я скучаю по штурму). Я привел вам пример левого соединения, но если вы хотите сохранить каждую запись из каждой таблицы, вам понадобится полное внешнее соединение (вам придется смоделировать его в mysql, потому что оно не реализовано)

CREATE TABLE table_name AS (

SELECT * 
  FROM table1 t1
  LEFT JOIN table2 t2 ON t1.email=t2.email AND t1.base_name=t2.base_name AND t1.location=t2.location
  ...
  LEFT JOIN tableN tN ON tN-1.email=tN.email AND tN-1.base_name=tN.base_name AND tN-1.location=tN.location

)

если вы хотите смоделировать полное внешнее объединение, вы должны объединиться так:

SELECT * 
  FROM table1 t1
  LEFT JOIN table2 t2 ON t1.email=t2.email AND t1.base_name=t2.base_name AND t1.location=t2.location
  ...
  LEFT JOIN tableN tN ON tN-1.email=tN.email AND tN-1.base_name=tN.base_name AND tN-1.location=tN.location

UNION

SELECT * 
  FROM tableN tN
  LEFT JOIN tableN-1 tN-1 ON tN.email=tN-1.email AND tN.base_name=tN-1.base_name AND tN-1.location=tN.location
  ...
  LEFT JOIN table1 t1 ON t2.email=t1.email AND t2.base_name=t1.base_name AND t1.location=t2.location
1 голос
/ 16 сентября 2011

Конечно, вы можете объединять таблицы, это даже не так сложно.
Вот пример для 3 таблиц, убедитесь, что все выборки в union s выводят одинаковое количество столбцов:

  SELECT 'table1' as tablename
         , email, basename, location, field1, field2, null, null
  FROM table1
UNION
  SELECT 'table2' as tablename
         , email, basename, location, field1, field2, field3, null
  FROM table2
UNION
  SELECT 'table3' as tablename
         , email, basename, location, field1, null, null, null
  FROM table3
UNION
  ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...