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

3272
carillonator

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

1

3 ответа на вопрос

2
mtone

Я не знаком с доступом, но в общем 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: Если вы предпочитаете изменять Таблицу А напрямую, вы можете использовать INSERT (обратите внимание, что вы не можете извлечь исходную Таблицу А таким образом, если не добавите некоторую дополнительную информацию в новый столбец, чтобы отслеживать свою работу)

INSERT INTO TableA (col1, col2)  SELECT col1, col2 from TableB  WHERE col1 not in (select col1 from TableA) 
1
Kenneth Cochran

К сожалению, этого нельзя сделать одним запросом.

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

  • Altova DatabaseSpy
  • RedGate SQL Data Compare

Очевидно, что лицензирование коммерческого инструмента создаст проблему, если вы намерены дать что-то своим клиентам для использования.

Самостоятельное написание инструмента - это всегда вариант, но объединение баз данных не совсем тривиальная операция. Вы можете взглянуть на этот пост в stackoverflow, в котором обсуждаются некоторые проблемы, с которыми вы, вероятно, столкнетесь. У вас может быть даже худшее время, потому что ваша база данных не использует проверку ссылочной целостности. Вы также можете посмотреть в ETL Tools . Не совсем предназначен для сценария слияния, но вы можете найти что-то, что сделает работу.

0
David W. Fenton

Из-за внешних ключей вам нужно отслеживать старые PK в объединенной таблице. В этом случае я всегда создаю столбец OldID и добавляю родительские записи в таблицу с оригинальным PK, добавленным в поле OldID. Затем я могу использовать этот OldID для ссылки на дочерние записи и добавить их с новым значением PK.