Доступ - объединение двух баз данных с одинаковой структурой
Я хотел бы написать запрос, который объединяет две базы данных Access 2000 в одну. Каждая имеет 35 таблиц с одинаковыми полями и в основном уникальными данными. Есть несколько строк, которые будут иметь один и тот же "первичный ключ", и в этом случае строка из базы данных A всегда должна иметь приоритет над базой данных B. Я использую кавычки вокруг "первичного ключа", потому что базы данных генерируются без каких-либо ключей или связей. Например:
База данных А, таблица1
col1 col2
Frank red
Debbie blue
База данных B, таблица1
col1 col2
Harry orange
Debbie pink
И результаты мне бы хотелось:
col1 col2
Frank red
Harry orange
Debbie blue
Эти базы данных создаются и загружаются пользователями, не знакомыми с sql, поэтому я хотел бы просто дать им запрос на копирование и вставку. Очевидно, им придется начать с импорта или связывания одной БД [in] с другой.
Я предполагаю, что мне придется создать третью таблицу с комбинированным запросом результатов, а затем удалить две другие. В идеале, однако, это просто взять таблицы базы данных B и добавить в базу данных A (переопределение там, где это необходимо).
Я, конечно, не ищу полного ответа, просто надеюсь получить совет о том, с чего начать. У меня есть некоторый опыт работы с MySQL и я понимаю основы соединений. Можно ли сделать все это в одном запросе, или мне придется иметь отдельный для каждой таблицы?
3 ответа
Я не знаком с доступом, но в общем SQL я бы сделал это следующим образом:
SELECT col1, col2 from TableA
UNION
SELECT col1, col2 from TableB where col1 not in (select col1 from TableA)
Это даст предпочтение Дебби в таблице А. По сути, вы объединяете целые две таблицы одна за другой, используя UNION, но непосредственно перед добавлением TableB в вас вы удаляете его из любого содержимого в col1, уже существующего в TableA.
РЕДАКТИРОВАТЬ: я говорю только о соединении 2 таблиц, а не две базы данных. Но вы можете повторить идею для каждой таблицы, если нет конфликтующих отношений.
РЕДАКТИРОВАТЬ 2: Если вы предпочитаете изменять Таблицу A напрямую, вы можете использовать INSERT (обратите внимание, что вы не можете извлечь исходную Таблицу A таким образом, если не добавите некоторую дополнительную информацию в новый столбец, чтобы отслеживать свою работу)
INSERT INTO TableA (col1, col2)
SELECT col1, col2 from TableB
WHERE col1 not in (select col1 from TableA)
К сожалению, этого нельзя сделать одним запросом.
Есть несколько хороших инструментов слияния баз данных, которые помогут:
- Altova DatabaseSpy
- RedGate SQL Data Compare
Очевидно, что лицензирование коммерческого инструмента создаст проблему, если вы намерены дать что-то своим клиентам для использования.
Самостоятельное написание инструмента - это всегда вариант, но объединение баз данных не совсем тривиальная операция. Вы можете взглянуть на этот пост в stackoverflow, в котором обсуждаются некоторые проблемы, с которыми вы, вероятно, столкнетесь. Это может быть еще хуже, потому что ваша база данных не использует проверку ссылочной целостности. Вы также можете посмотреть в ETL Tools. Не совсем предназначен для сценария слияния, но вы можете найти что-то, что сделает работу.
Из-за внешних ключей вам нужно отслеживать старые PK в объединенной таблице. В этом случае я всегда создаю столбец OldID и добавляю родительские записи в таблицу с оригинальным PK, добавленным в поле OldID. Затем я могу использовать этот OldID для ссылки на дочерние записи и добавить их с новым значением PK.