Access - Mesclar dois bancos de dados com estrutura idêntica

1

Eu gostaria de escrever uma consulta que mescla dois bancos de dados do Access 2000 em um. Cada um tem 35 tabelas com campos idênticos e principalmente dados exclusivos. Existem algumas linhas que terão a mesma "chave primária", caso em que a linha do banco de dados A deve sempre ter precedência sobre o banco de dados B. Eu uso aspas em torno da "chave primária" porque os bancos de dados são gerados sem nenhuma chave ou relacionamento. Por exemplo:

Banco de dados A, tabela1

col1    col2
Frank   red
Debbie  blue

Banco de dados B, tabela1

col1    col2
Harry   orange
Debbie  pink

E os resultados que eu gostaria:

col1    col2
Frank   red
Harry   orange
Debbie  blue

Esses bancos de dados são gerados e baixados por usuários que não são sql, então eu gostaria de lhes dar uma consulta para copiar e colar. Eles obviamente terão que iniciar importando ou vinculando um DB [in] para outro.

Suponho que terei que criar uma terceira tabela com a consulta de resultados combinada e, em seguida, excluir os outros dois. Idealmente, no entanto, seria apenas tomar as tabelas do banco de dados B e adicionar no banco de dados A (substituindo onde for necessário).

É claro que não estou procurando uma resposta completa, apenas esperando alguns conselhos sobre por onde começar. Eu tenho uma experiência mySQL e entendo o básico das junções. É possível fazer isso tudo em uma consulta, ou terei que ter um separado para cada tabela?

    
por carillonator 02.02.2010 / 19:37

3 respostas

2

Eu não estou familiarizado com o acesso, mas no SQL genérico eu faria assim:

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

Isso dará preferência a Debbie na Tabela A. Basicamente, você está juntando as duas tabelas inteiras uma após a outra usando UNION , mas antes de adicionar Tabela B em você está removendo-o de qualquer conteúdo em col1 já existente na Tabela A.

EDIT: Estou falando apenas de juntar 2 tabelas, não duas bases de dados. Mas você pode replicar a ideia para cada tabela, desde que não haja colisão de relacionamentos.

EDIT2: Se você preferir modificar a TableA diretamente, você pode usar INSERT (observe não é possível recuperar o TableA original dessa maneira, a menos que você adicione algumas informações extras em uma nova coluna para acompanhar sua operação)

INSERT INTO TableA (col1, col2) 
SELECT col1, col2 from TableB 
WHERE col1 not in (select col1 from TableA)
    
por 02.02.2010 / 23:24
1

Infelizmente, isso não pode ser feito com uma única consulta.

Existem algumas boas ferramentas de mesclagem de banco de dados que ajudarão:

  • Altova DatabaseSpy
  • RedGate SQL Data Compare

Obviamente, o licenciamento de uma ferramenta comercial apresentará um problema se sua intenção for dar algo para seus clientes usarem.

Escrever uma ferramenta é sempre uma opção, mas a mesclagem de banco de dados não é exatamente uma operação trivial. Você pode dar uma olhada neste postar no stackoverflow, que discute alguns dos problemas que você provavelmente enfrentará. Você pode ter um tempo ainda pior porque seu banco de dados não está usando a verificação de integridade referencial. Você também pode pesquisar as Ferramentas de ETL . Não projetado exatamente para um cenário de mesclagem, mas você pode encontrar algo que funcione.

    
por 02.02.2010 / 22:03
0

Por causa das chaves estrangeiras, você precisa acompanhar os PKs antigos na tabela combinada. Eu sempre criar uma coluna OldID nesse caso e acrescentar os registros pai à tabela com o PK original acrescentado ao campo OldID. Então eu posso usar esse OldID para vincular aos registros filhos e anexá-los com o novo valor PK.

    
por 02.02.2010 / 23:28