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

Я хотел бы записать запрос, который объединяет две базы данных Access 2000 в одну. У каждого есть 35 таблиц с идентичными полями и главным образом уникальными данными. Существуют некоторые строки, которые будут иметь тот же "первичный ключ", в этом случае, строка от базы данных A должна всегда иметь приоритет по базе данных B. Я использую кавычки вокруг "первичного ключа", потому что базы данных сгенерированы без любых ключей или отношений. Например:

База данных A, table1

col1    col2
Frank   red
Debbie  blue

База данных B, table1

col1    col2
Harry   orange
Debbie  pink

И результаты я хотел бы:

col1    col2
Frank   red
Harry   orange
Debbie  blue

Эти базы данных сгенерированы и загружены non-sql-savvy пользователями, таким образом, я хотел бы просто дать им запрос, чтобы скопировать и вставить. Они должны будут, очевидно, запустить путем импорта или соединения одного DB [в] другому.

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

Я, конечно, не ищу полный ответ, просто надеясь на некоторый совет относительно того, где запустить. Я имею некоторый опыт MySQL и понимаю основы соединений. Действительно ли возможно сделать это все в одном запросе, или у меня должен будет быть отдельный для каждой таблицы?

1
задан 24.05.2011, 21:48

3 ответа

Я не знаком с доступом, но в универсальном SQL я сделал бы это этот путь:

SELECT col1, col2 from TableA
UNION
SELECT col1, col2 from TableB where col1 not in (select col1 from TableA)

Это даст предпочтение Debbie в TableA. В основном Вы присоединяетесь к целым двум таблицам один за другим с помощью ОБЪЕДИНЕНИЯ, но прежде, чем добавить, что TableB в Вас разделяют его от любого содержания в col1, уже существует в TableA.

Править: Я только говорю о присоединении к 2 таблицам, не двум базам данных. Но можно копировать идею для каждой таблицы, пока нет никаких сталкивающихся отношений.

EDIT2: Если Вы предпочитаете изменять TableA непосредственно, можно использовать, ВСТАВЛЯЮТ (обратите внимание, что Вы не можете получить исходный TableA этот путь, если Вы не добавляете некоторую дополнительную информацию в новом столбце для отслеживания операцию),

INSERT INTO TableA (col1, col2) 
SELECT col1, col2 from TableB 
WHERE col1 not in (select col1 from TableA)
2
ответ дан 12.12.2019, 10:46

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

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

  • Altova DatabaseSpy
  • Данные RedGate SQL выдерживают сравнение

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

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

1
ответ дан 12.12.2019, 10:46

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

0
ответ дан 12.12.2019, 10:46

Теги

Похожие вопросы