Resultado de dois bancos distintos em apenas um SQL

=================================================================
Howto: Como realizar a busca em dois bancos distintos e unir o resultado em apenas um SQL?
=================================================================

Primeiro o problema:
Você precisa fazer uma busca em dois bancos de dados e mostrar o resultado em um lugar só, isso porque você tem partes dos dados em um banco e o restante dos dados em outro banco, e por motivo estrutural, burocrático… sabe-se lá porque…. você não pode unir tudo em um único database.

Solução:
Você pode unir dois resultados (inclusive de drivers/bancos que estejam na mesma conexão) em um unico result, mesclando os dados. Para isso deve-se utilizar a estrutura UNION.

Analisemos a seguinte query:

[sql]
SELECT cod, nome, idade FROM pessoas
SELECT codigo, nome_completo, idade FROM pessoas_nao_cadastradas
[/sql]

Primeiro, você deve ter resultados iguais para cada select, para isso use alias para igualar os resultados.

[sql]
SELECT cod, nome, idade FROM pessoas
SELECT codigo AS cod, nome_completo AS nome, idade FROM pessoas_nao_cadastradas
[/sql]

Agora, basta você usar o UNION entre os dois selects:

[sql]
SELECT cod, nome, idade FROM pessoas
UNION
SELECT codigo AS cod, nome_completo AS nome, idade FROM pessoas_nao_cadastradas
[/sql]

Já, agora você tem o resultado de dois bancos de dados mesclados em um só.

E como fazer um LIKE (WHERE)?

Você deve fazer um WHERE ou nos dois SELECTs ou fazer um SELECT que totaliza os dois:

[sql]
SELECT xyz.* FROM (
SELECT cod, nome, idade FROM pessoas
UNION
SELECT codigo AS cod, nome_completo AS nome, idade FROM pessoas_nao_cadastradas

) xyz WHERE nome = ‘Paulo’
[/sql]

5 thoughts to “Resultado de dois bancos distintos em apenas um SQL”

  1. Quero deixar aqui minha humilde contribuição a fim de agregar um pouco mais ao seu texto.

    A algum tempo passei por uma situação parecida e resolvi da mesma forma e pra matar a cobra e mostrar o pau eu joguei a SQL em uma view assim eu pude usar a SQL em outras partes da minha aplicação.

  2. Eu não vi o exemplo de dois bancos distintos ai, somente de duas tabelas – ou seja, um union simples…

  3. Bem, é claro que há necessidade de especificar a conexão de cada banco, o que fiz foi extrair essa parte para compor o post, mas é necessário as especificações de cada BD. Vejam este outro exemplo:

    $link = mysql_connect(‘localhost’, ‘root’, ”);
    $link2 = mysql_connect(‘REMOTE IP’, ‘remote_user’, ‘password’);
    mysql_select_db(‘remote_db’, $link2);

    $query = “SELECT local_db.coords.name FROM local_db.coords
    union SELECT coords.name FROM coords”;
    $result = mysql_query($query) or die(“Query failed : $query ” . mysql_error());
    $line = mysql_fetch_array($result);

  4. Preciso de ajuda:
    Tenho dois bancos de dados. Em um deles tenho a tabela Origem e a tabela Destino. No outro tenho a tabela Base.
    Na tabela Origem tenho os campos X, Y e Z. Na tabela Base tenho os campos X, Y, Z, 1, 2, 3, 4. A tabela Destino tem os mesmos campos da tabela Base.
    Como faço para cruzar os campos comuns das tabelas Origem e Base (X, Y e Z) e colocando o resultado na tabela Destino?

Leave a Reply

Your email address will not be published. Required fields are marked *