Доступ - объединение двух баз данных с одинаковой структурой

Я хотел бы написать запрос, который объединяет две базы данных 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.

Другие вопросы по тегам