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

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

эти базы данных генерируются и загружаются пользователями, не разбирающимися в sql, поэтому я хотел бы просто дать им запрос на копирование и вставку. Очевидно, что им придется начать с импорта или связывания одной базы данных [in]с другой.

Я предполагаю, что мне придется сделать третью таблицу с комбинированным запросом результатов, а затем удалить другие два. В идеале, однако, это будет просто взять таблицы базы данных Б и добавить в базе данных а (переопределение, где это необходимо).

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

26
задан KronoS
19.04.2023 4:07 Количество просмотров материала 3629
Распечатать страницу

3 ответа

Я не знаком с access, но в generic SQL я бы сделал это следующим образом:

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

это даст предпочтение Дебби в таблице. В основном, вы соединяете две таблицы одну за другой, используя Союз, но как раз перед добавлением TableB в вас обнажают его от любого содержания в col1 уже существует в Tabla.

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

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

INSERT INTO TableA (col1, col2) 
SELECT col1, col2 from TableB 
WHERE col1 not in (select col1 from TableA)
2
отвечен mtone 2023-04-20 11:55

к сожалению, это невозможно сделать одним запросом.

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

  • Altova DatabaseSpy
  • Redgate SQL сравнение данных

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

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

1
отвечен Kenneth Cochran 2023-04-20 14:12

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

0
отвечен David W. Fenton 2023-04-20 16:29

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх