Как объединить данные из двух отдельных баз данных Access 2007 - PullRequest
2 голосов
/ 20 апреля 2010

У меня есть две идентичные базы данных с одинаковой структурой: база данных a на компьютере a и база данных b на компьютере b.

Данные базы данных a **** (a.accdb) **** и базы данных b **** (b.accdb) **** различны. затем в базе данных a у меня есть например ID: 1, 2, 3 и в базе данных B у меня есть ID: 4,5,6

Тогда мне нужно объединить данные этих баз данных только в одну базу данных (a или b, не имеет значения), чтобы итоговая база данных выглядела так. ID: 1,2,3,4,5,6

Я ищу простой способ сделать это. потому что у меня много столов. и делать это с помощью запроса объединения очень утомительно.

Я ищу, например, вариант резервного копирования только для данных без схемы, как в postgreSQl или многих других СУБД, но я не вижу этих параметров в Access 2007.

pd: только одна таблица может иметь повторяющиеся значения (я полагаю, что pk не позволяет копировать дублирующее значение, а все остальные значения будут хорошо скопированы). если я ошибаюсь, поправьте меня.

спасибо за вашу помощь.

1 Ответ

3 голосов
/ 20 апреля 2010

Если у вас есть таблица tblFoo с одинаковой структурой в обеих базах данных, вы можете попробовать добавить содержимое одной таблицы в другую. Итак, с открытым a.accdb:

INSERT INTO tblFoo
SELECT *
FROM tblFoo IN 'C:\YourPath\b.accdb';

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

Я надеюсь, что у вас есть резервные копии обеих баз данных, прежде чем пытаться консолидировать любую форму.

Редактировать : Если этот метод удовлетворительный, вам не нужно создавать запрос для каждой таблицы. Используйте VBA для создания и выполнения запроса для вас.

Public Sub ImportTableData(ByVal pstrTable As String, _
        ByVal pstrDb As String)

    Dim strSql As String
    strSql = "INSERT INTO " & pstrTable & vbNewLine & _
        "SELECT *" & vbNewLine & _
        "FROM " & pstrTable & " IN '" & pstrDb & "';"
    'caller will handle errors '
    CurrentDb.Execute strSql, dbFailOnError
End Sub

Поскольку вы предпочитаете выполнять передачу таблиц как одну операцию, вы можете использовать другую процедуру VBA для передачи имен таблиц в процедуру ImportTableData.

Public Sub ImportAllTables()
    Const cstrDb As String = "C:\YourPath\b.accdb"
    Dim tdf As TableDef
    Dim strMsg As String

On Error GoTo ErrorHandler

    For Each tdf In CurrentDb.TableDefs
        'ignore system and temporary tables '
        If Not (tdf.Name Like "MSys*" Or _
                tdf.Name Like "~*") Then
            Call ImportTableData(tdf.Name, cstrDb)
        End If
    Next tdf

ExitHere:
    On Error GoTo 0
    Set tdf = Nothing
    Exit Sub

ErrorHandler:
    Select Case Err.Number
    Case 3078
        strMsg = "Input table " & tdf.Name & " not found."
        MsgBox strMsg
        Resume Next
    Case Else
        strMsg = "Error " & Err.Number & " (" & Err.Description _
            & ") in procedure ImportAllTables"
        MsgBox strMsg
        GoTo ExitHere
    End Select
End Sub
...