Esecuzione di query sui dati unendo due tabelle in due database su server diversi


Risposte:


86

Dovrai utilizzare sp_addlinkedserverper creare un collegamento al server. Vedere la documentazione di riferimento per l'utilizzo. Una volta stabilito il collegamento al server, costruirai la query come di consueto, anteponendo semplicemente il nome del database all'altro server. IE:

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

Una volta stabilito il collegamento, è anche possibile utilizzare OPENQUERYper eseguire un'istruzione SQL sul server remoto e trasferire di nuovo solo i dati. Questo può essere un po 'più veloce e consentirà al server remoto di ottimizzare la tua query. Se memorizzi nella cache i dati in una tabella temporanea (o in memoria) DB1nell'esempio sopra, sarai in grado di interrogarli proprio come unirti a una tabella standard. Per esempio:

-- 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

Consulta la documentazione di OPENQUERY per vedere altri esempi. L'esempio sopra è piuttosto artificioso. Vorrei sicuramente utilizzare il primo metodo in questo esempio specifico, ma la seconda opzione OPENQUERYpuò far risparmiare tempo e prestazioni se si utilizza la query per filtrare alcuni dati.


1
è possibile con php-mysql .. se sì, puoi suggerirmi un modo come posso crescere con questa opzione?
Jhanvi

1
Non ho idea se MySQL supporti i server collegati. Questa risposta è specifica per il server Microsoft SQL.
Scott Anderson

3
Se qualcuno sta cercando una risposta PostgreSQL, prova questo: postgresql.org/docs/9.4/static/postgres-fdw.html
PJSCopeland

7

Prova questo:

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 un server collegato non è consentito dal tuo dba, puoi usare OPENROWSET. La documentazione in linea fornirà la sintassi necessaria.


4

Da una prospettiva aziendale pratica, la best practice consiste nel creare una copia speculare della tabella del database nel database, quindi fare in modo che un'attività / processo lo aggiorni con delta ogni ora.


1

Un join di due tabelle è fatto meglio da un DBMS, quindi dovrebbe essere fatto in questo modo. È possibile eseguire il mirroring della tabella o del sottoinsieme più piccolo su uno dei database e quindi unirli. Si potrebbe essere tentati di farlo su un server ETL come l'informatica, ma immagino che non sia consigliabile se le tabelle sono enormi.


1

Se l'opzione di collegamento al database non è disponibile, un altro percorso che potresti seguire è collegare le tabelle tramite ODBC a qualcosa come MS Access o Crystal Reports e fare il join lì.


0

Forse i nomi di database hardcoded non sono l'approccio migliore sempre all'interno di una query SQL. Pertanto, l'aggiunta di sinonimi sarebbe un approccio migliore. Non è sempre il caso che i database abbiano lo stesso nome in diversi ambienti di staging. Potrebbero essere costituiti da postfix come PROD, UAT, SIT, QA e così via. Quindi sii consapevole delle query hard-coded e rendile più dinamiche.

Approccio n. 1: utilizzare sinonimi per collegare tabelle tra database sullo stesso server.

Approccio n. 2: raccogli i dati separatamente da ogni database e uniscili nel tuo codice. Le stringhe di connessione al database potrebbero far parte della configurazione del server app tramite un database o un file di configurazione.


-2

Ho provato questo codice di seguito e funziona bene

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

Le risposte dovrebbero essere generiche, non solo un copia-incolla dei tuoi casi d'uso. Inoltre, questo non aiuta l'utente che ha posto la domanda.
Wladimir Gramacho

-2

Potresti provare quanto segue:

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

per questo segui semplicemente la query di seguito

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

Dove ho scritto databasename, devi definire il nome del database. Se sei nello stesso database quindi non è necessario definire il nome del database, ma se sei in un altro database devi menzionare il nome del database come percorso o ti mostrerà un errore. Spero di aver reso il tuo lavoro facile


-2

Mentre stavo avendo problemi a unire quei due tavoli, sono riuscito a fare esattamente quello che volevo aprendo entrambi i database remoti allo stesso tempo. MySQL 5.6 (php 7.1) e l'altro 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 vengono visualizzati quei due OK sullo schermo, entrambi i database sono aperti e pronti. Quindi puoi procedere con le tue ricerche.

$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();

Stavo cercando di eseguire alcuni join ma poiché ho aperto quei due DB, posso andare avanti e indietro facendo query semplicemente cambiando la connessione $mysqli1o$mysqli2

Ha funzionato per me, spero che aiuti ... Salute


Immagino che nessuno abbia detto di non usare php ... Ho avuto lo stesso problema e sono riuscito a risolverlo con un po 'di programmazione
Luis H Cabrejo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.