Consulta de dados juntando duas tabelas em dois bancos de dados em servidores diferentes


Respostas:


86

Você precisará usar sp_addlinkedserverpara criar um link de servidor. Consulte a documentação de referência para uso. Assim que o link do servidor for estabelecido, você construirá a consulta normalmente, apenas prefixando o nome do banco de dados com o outro servidor. IE:

-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
    INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
        ON tab1.ID = tab2.ID

Depois que o link for estabelecido, você também pode usar OPENQUERYpara executar uma instrução SQL no servidor remoto e transferir apenas os dados de volta para você. Isso pode ser um pouco mais rápido e permitirá que o servidor remoto otimize sua consulta. Se você armazenar os dados em cache em uma tabela temporária (ou na memória) DB1no exemplo acima, será capaz de consultá-los da mesma forma que ingressar em uma tabela padrão. Por exemplo:

-- Fetch data from the other database server
SELECT *
INTO #myTempTable
FROM OPENQUERY([DB2], 'SELECT * FROM [MyDatabaseOnDB2].[dbo].[MyOtherTable]')

-- Now I can join my temp table to see the data
SELECT * FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
    INNER JOIN #myTempTable tab2 ON tab1.ID = tab2.ID

Verifique a documentação do OPENQUERY para ver mais alguns exemplos. O exemplo acima é muito artificial. Eu definitivamente usaria o primeiro método neste exemplo específico, mas a segunda opção OPENQUERYpode economizar algum tempo e desempenho se você usar a consulta para filtrar alguns dados.


1
é possível com php-mysql .. se sim, então você pode me sugerir uma maneira de como posso crescer com essa opção?
Jhanvi

1
Não tenho ideia se o MySQL oferece suporte a servidores vinculados. Essa resposta é específica para o servidor Microsoft SQL.
Scott Anderson,

3
Se alguém está procurando uma resposta PostgreSQL, tente isto: postgresql.org/docs/9.4/static/postgres-fdw.html
PJSCopeland

7

Experimente isto:

SELECT tab2.column_name  
FROM  [DB1.mdf].[dbo].[table_name_1] tab1 INNER JOIN [DB2.mdf].[dbo].[table_name_2]  tab2   
    ON tab1.col_name = tab2.col_name

5

Se um servidor vinculado não for permitido por seu dba, você pode usar OPENROWSET. O Books Online fornecerá a sintaxe necessária.


4

De uma perspectiva empresarial prática, a melhor prática é fazer uma cópia espelhada da tabela do banco de dados em seu banco de dados e, em seguida, apenas ter uma tarefa / proc atualizá-la com delta's a cada hora.


1

Uma junção de duas tabelas é melhor feita por um SGBD, portanto, deve ser feito dessa forma. Você pode espelhar a tabela menor ou subconjunto dela em um dos bancos de dados e, em seguida, juntá-los. Alguém pode ficar tentado a fazer isso em um servidor ETL como a Informatica, mas acho que não é aconselhável se as tabelas forem enormes.


1

Se a opção de link de banco de dados não estiver disponível, outro caminho que você pode seguir é vincular as tabelas via ODBC a algo como o MS Access ou Crystal reports e fazer a junção lá.


0

Talvez nomes de banco de dados embutidos em código não sejam a melhor abordagem sempre em uma consulta SQL. Portanto, adicionar sinônimos seria uma abordagem melhor. Nem sempre é o caso de bancos de dados terem o mesmo nome em vários ambientes de teste. Eles podem consistir em postfixes como PROD, UAT, SIT, QA e assim por diante. Portanto, esteja ciente das consultas embutidas em código e torne-as mais dinâmicas.

Abordagem nº 1: use sinônimos para vincular tabelas entre bancos de dados no mesmo servidor.

Abordagem nº 2: Colete dados separadamente de cada banco de dados e junte-os ao seu código. Suas strings de conexão de banco de dados podem fazer parte da configuração do servidor de aplicativos por meio de um banco de dados ou de um arquivo de configuração.


-2

Eu tentei este código abaixo e está funcionando bem

SELECT        TimeTrackEmployee.StaffID
FROM            dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
                         TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID

As respostas devem ser genéricas, não apenas copiar e colar seus casos de uso. Além disso, isso não ajuda o usuário que fez a pergunta.
Wladimir Gramacho

-2

Você pode tentar o seguinte:

select customer1.Id,customer1.Name,customer1.city,CustAdd.phone,CustAdd.Country
from customer1
inner join [EBST08].[Test].[dbo].[customerAddress] CustAdd
on customer1.Id=CustAdd.CustId

-2

para isso basta seguir a consulta abaixo

select a.Id,a.type,b.Name,b.City from DatabaseName.dbo.TableName a left join DatabaseName.dbo.TableName b on a.Id=b.Id

Onde escrevi databasename, você deve definir o nome do banco de dados. Se você estiver no mesmo banco de dados, não precisa definir o nome do banco de dados, mas se estiver em outro banco de dados, você deve mencionar o nome do banco de dados como caminho ou ele mostrará o erro. Espero ter facilitado o seu trabalho


-2

Enquanto estava tendo problemas para unir essas duas tabelas, consegui fazer exatamente o que queria abrindo os dois bancos de dados remotos ao mesmo tempo. MySQL 5.6 (php 7.1) e o outro MySQL 5.1 (php 5.6)

//Open a new connection to the MySQL server
$mysqli1 = new mysqli('server1','user1','password1','database1');
$mysqli2 = new mysqli('server2','user2','password2','database2');

//Output any connection error
if ($mysqli1->connect_error) {
    die('Error : ('. $mysqli1->connect_errno .') '. $mysqli1->connect_error);
} else { 
echo "DB1 open OK<br>";
}
if ($mysqli2->connect_error) {
    die('Error : ('. $mysqli2->connect_errno .') '. $mysqli2->connect_error);
} else { 
echo "DB2 open OK<br><br>";
}

Se você receber esses dois OKs na tela, os dois bancos de dados estarão abertos e prontos. Então você pode prosseguir para fazer suas perguntas.

$results = $mysqli1->query("SELECT * FROM video where video_id_old is NULL");
    while($row = $results->fetch_array()) {
        $theID = $row[0];
        echo "Original ID : ".$theID." <br>";
        $doInsert = $mysqli2->query("INSERT INTO video (...) VALUES (...)");
        $doGetVideoID = $mysqli2->query("SELECT video_id, time_stamp from video where user_id = '".$row[13]."' and time_stamp = ".$row[28]." ");
            while($row = $doGetVideoID->fetch_assoc()) {
                echo "New video_id : ".$row["video_id"]." user_id : ".$row["user_id"]." time_stamp : ".$row["time_stamp"]."<br>";
                $sql = "UPDATE video SET video_id_old = video_id, video_id = ".$row["video_id"]." where user_id = '".$row["user_id"]."' and video_id = ".$theID.";";
                $sql .= "UPDATE video_audio SET video_id = ".$row["video_id"]." where video_id = ".$theID.";";
                // Execute multi query if you want
                if (mysqli_multi_query($mysqli1, $sql)) {
                    // Query successful do whatever...
                }
            }
    }
// close connection 
$mysqli1->close();
$mysqli2->close();

Eu estava tentando fazer algumas junções, mas como abri esses dois bancos de dados, posso ir e voltar fazendo consultas apenas alterando a conexão $mysqli1ou$mysqli2

Funcionou para mim, espero que ajude ... Saúde


Acho que ninguém disse para não usar php ... Tive o mesmo problema e consegui resolver com alguma programação
Luis H Cabrejo 11/10/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.