Russian version
English version
ОБ АЛЬЯНСЕ | НАШИ УСЛУГИ | КАТАЛОГ РЕШЕНИЙ | ИНФОРМАЦИОННЫЙ ЦЕНТР | СТАНЬТЕ СПОНСОРАМИ SILICON TAIGA | ISDEF | КНИГИ И CD | ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ | УПРАВЛЕНИЕ КАЧЕСТВОМ | РОССИЙСКИЕ ТЕХНОЛОГИИ | НАНОТЕХНОЛОГИИ | ЮРИДИЧЕСКАЯ ПОДДЕРЖКА | АНАЛИТИКА | КАРТА САЙТА | КОНТАКТЫ
 
Программное обеспечение
 
Для зарегистрированных пользователей
 
РАССЫЛКИ НОВОСТЕЙ
IT-Новости
Новости компаний
Российские технологии
Новости ВПК
Нанотехнологии
 
Поиск по статьям
 
RSS-лента
Подписаться
Средства разработки

Как соединить записи из двух идентичных таблиц базы данных

Что интересно, обычно все стараются получить данные, используя стандартные возможности Аксеса через меню File / Get External Data, но они затем обнаруживают, что в данном случае происходит всего лишь импорт их таблиц. Так что здесь зарыта очень большая разница в случае добавления данных и их комбинирования и понимания всего этого. Свойства спроектированной базы данных включают в себя первичные и вторичные ключи и очень часто, автоматически генерируемые индентификаторы (ID) записей, то бишь счётчики по-русски если. Как мы увидим, вы не можете просто добавить эти записи в одну таблицу.

Процесс добавления это целый раздел реляционных (взаимосвязанных) данных, который может быть достаточно запутанным, особенно, когда вы имеете множественные, зависимые друг от друга таблицы. Каждый такой случай имеет свои собственные особенности, я лишь объясню основные шаги, используя в качестве примера таблицу данных учёта рабочего времени.

Представте себе, что данная программа была разработана для двух различных сайтов в двумя совершенно раздельными mdb-шными файлами. Некоторые таблицы содержат уникальные данные, такие как tblEmployee и tblTimeRecord, а некоторые содержат не уникальные, например tblStatus.

Давайте условимся, что каждая таблица имеет своё поле счётчика ID, которое начинает считать с 1. Оба сайта будут иметь свои собственные, пронуменованне с 1 до n, записи своих работников и их время работы.

Если вы добавите записи работников (Employee) из сайта В в сайт А, то получите конфиликт счётчиков, так как, как правило, поле счётчиков всегда уникальное, и не позволяет дублированных значений, а у вас на разных сайтах естественно под одним номером будут записаны совершенно разные фамилии.

В случае же, если вы поменяете счётчик EmployeeID на сайте В, вы получите каскадное изменение в связанных таблицах сайта В, таких как tblTimeRecord. Как же поступить в данном случае?

ЗАМЕЧАНИЕ: Перед началом, сохраните все ваши данные и всегда работайте только с копией реальной базы данных!

Обсудим необходимые изменения в базе данных сайта В...

1. Поле счётчика EmployeeID в таблице tblEmployee сайта В трансформируйте в длинное целое.

2. Сохраните наибольшее значение счётчика EmployeeID сайта А в переменной с именем lngMaxSiteA_ID.

3. Будьте уверены, что каскадные обновления включены для всех взаимосвязанных таблиц базы данных сайта В, которые имеют всязи с полем EmployeeID.

4. Запустите простой запрос на обнавление UPDATE, который прибавит значение переменной lngMaxSiteA_ID к полю EmployeeID для каждой записи таблицы tblEmployee сайта В. При этом каскадное обновление размножит эти изменения по всей базе данных.

5. Добавте все записи сайта В из таблицы tblEmployee на сайт А в таблицу tblEmployee.

( Даже в случае если сайт А ещё имеет счётчик в поле EmployeeID, записи всё равно добавяться без ошибок и номер ID будет установлен корректно.)

6. Повторите эту процедуру для каждой таблицы, содержащей счётчики ID.

Вроде бы не сильно сложно, но это ещё не всё.

Реальные проблемы возникают, когда мы имеем дело с 'lookup' таблицами, такими как к примеру tblStatus. Давайте условимся, что каждая задача в таблице tblTask имеет связанный статус.

Если каждая база данных (сайт А и сайт В) установлена с заданным списком статусов, то тогда это не проблема, но если каждый конечный пользователь может иметь свои собственные значения, вы получите что-то типа этого:

Site A: tblStatus

-

1 Open

2 Completed

3 Cancelled

4 Needs Approval

Site B: tblStatus

-

1 Completed

2 Open

3 Cancelled

4 Pending

В этом случае, вам будет нужно создать таблицу переназначения, показывающую, как эти две таблицы статусов связаны друг с другом. Эта таблица tblMapStatus создаётся в базе данных сайта В и выглядит следующим образом:

OldID (B) NewID (A) Status

-

1 2 Completed

2 1 Open

3 3 Cancelled

4 Null Pending

Какие мы видим здесь проблемы?

Сайт А имеет статус, которого нет на сайте В. Это не проблема с одной стороны, а именно, сайт В не использует статус 'Needs Approval' и нам не нужно его переназначать. Но нам нужен ID с номером 4 для отображения статуса 'Pending'.

Поэтому, вам нужно вернуться к таблице tblStatus сайта А, добавить ошибочный статус ('Pending') и убедиться, что ему будет назначен новый ID номер. В нашем случае, это будет номер 5, потом мы должны соответственно обновить нашу таблицу tblMapStatus.

OldID (B) NewID (A) Status

1 2 Completed

2 1 Open

3 3 Cancelled

4 5 Pending

Теперь мы обновим нашу базу данных сайта В, запустив обновляющий UPDATE запрос ...

UPDATE tblStatus

INNER JOIN tblMapStatus

ON tblStatus.ID = tblMapStatus.ID

SET tblStatus.ID = tblMapStatus.NewID

Однажды снова, эта процедура может быть повторена для всех справочных/вспомогательных таблиц когда это будет необходимо, при этом каскадное обновление должно быть включено для того, чтобы налагаемые изменения в таблицах переназначения распространялись на всю базу данных. Когда всё закончится, переназначающие таблицы могут быть удалены, так как такие таблицы как tblStatus на сайте А уже будут содержать все возможные значения.


  Рекомендовать страницу   Обсудить материал Написать редактору  
  Распечатать страницу
 
  Дата публикации: 23.04.2006  

ОБ АЛЬЯНСЕ | НАШИ УСЛУГИ | КАТАЛОГ РЕШЕНИЙ | ИНФОРМАЦИОННЫЙ ЦЕНТР | СТАНЬТЕ СПОНСОРАМИ SILICON TAIGA | ISDEF | КНИГИ И CD | ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ | УПРАВЛЕНИЕ КАЧЕСТВОМ | РОССИЙСКИЕ ТЕХНОЛОГИИ | НАНОТЕХНОЛОГИИ | ЮРИДИЧЕСКАЯ ПОДДЕРЖКА | АНАЛИТИКА | КАРТА САЙТА | КОНТАКТЫ

Дизайн и поддержка: Silicon Taiga   Обратиться по техническим вопросам  
Rambler's Top100 Rambler's Top100