Consultar datos uniendo dos tablas en dos bases de datos en diferentes servidores

102

Hay dos tablas en dos bases de datos diferentes en diferentes servidores, necesito unirlas para hacer pocas consultas. ¿Que opciones tengo? ¿Qué tengo que hacer?

Kashif
fuente
Como si PRAMP te hubiera traído aquí
Janac Meena

Respuestas:

86

Deberá utilizar sp_addlinkedserverpara crear un enlace de servidor. Consulte la documentación de referencia para conocer su uso. Una vez que se establece el enlace del servidor, construirá la consulta como de costumbre, simplemente prefijando el nombre de la base de datos con el otro servidor. ES DECIR:

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

Una vez que se establece el enlace, también puede usar OPENQUERYpara ejecutar una declaración SQL en el servidor remoto y transferirle solo los datos. Esto puede ser un poco más rápido y permitirá que el servidor remoto optimice su consulta. Si almacena en caché los datos en una tabla temporal (o en memoria) DB1en el ejemplo anterior, podrá consultarlos como si se uniera a una tabla estándar. Por ejemplo:

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

Consulte la documentación de OPENQUERY para ver algunos ejemplos más. El ejemplo anterior es bastante elaborado. Definitivamente usaría el primer método en este ejemplo específico, pero la segunda opción que usa OPENQUERYpuede ahorrar algo de tiempo y rendimiento si usa la consulta para filtrar algunos datos.

Scott Anderson
fuente
1
¿Es posible con php-mysql ... si es así, entonces puede sugerirme una forma de cómo puedo crecer con esa opción?
Jhanvi
1
No tengo idea de si MySQL admite servidores vinculados. Esta respuesta es específica del servidor Microsoft SQL.
Scott Anderson
3
Si alguien está buscando una respuesta de PostgreSQL, intente esto: postgresql.org/docs/9.4/static/postgres-fdw.html
PJSCopeland
7

Prueba esto:

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
Dev ashish y kapil jangid
fuente
5

Si su dba no permite un servidor vinculado, puede usar OPENROWSET. Books Online le proporcionará la sintaxis que necesita.

HLGEM
fuente
4

Desde una perspectiva empresarial práctica, la mejor práctica es hacer una copia reflejada de la tabla de la base de datos en su base de datos y luego hacer que una tarea / proceso la actualice con delta cada hora.

Dave
fuente
1

La combinación de dos tablas se realiza mejor con un DBMS, por lo que debe hacerse de esa manera. Puede reflejar la tabla más pequeña o un subconjunto de ella en una de las bases de datos y luego unirlas. Uno podría tener la tentación de hacer esto en un servidor ETL como informatica, pero supongo que no es aconsejable si las tablas son enormes.

Abdulmoeed
fuente
1

Si la opción de enlace de la base de datos no está disponible, otra ruta que podría tomar es vincular las tablas a través de ODBC a algo como MS Access o Crystal Reports y unirse allí.

Agárrate fuerte
fuente
0

Quizás los nombres de bases de datos codificados no sean el mejor enfoque siempre dentro de una consulta SQL. Por lo tanto, agregar sinónimos sería un mejor enfoque. No siempre es el caso de que las bases de datos tengan el mismo nombre en varios entornos de ensayo. Pueden consistir en sufijos como PROD, UAT, SIT, QA, etc. Por lo tanto, tenga en cuenta las consultas codificadas de forma rígida y hágalas más dinámicas.

Enfoque n. ° 1: use sinónimos para vincular tablas entre bases de datos en el mismo servidor.

Enfoque n. ° 2: recopile datos por separado de cada base de datos y únalos en su código. Las cadenas de conexión de su base de datos podrían ser parte de la configuración de su servidor de aplicaciones a través de una base de datos o un archivo de configuración.

Niklas Henricson
fuente
-2

Probé este código a continuación y está funcionando bien

SELECT        TimeTrackEmployee.StaffID
FROM            dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
                         TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
Quang Ninh
fuente
Las respuestas deben ser genéricas, no solo copiar y pegar sus casos de uso. Además, esto no ayuda al usuario que hizo la pregunta.
Wladimir Gramacho
-2

Puedes probar lo siguiente:

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
sohan yadav
fuente
-2

para esto simplemente siga la siguiente consulta

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

Donde escribí el nombre de la base de datos, tienes que definir el nombre de la base de datos. Si está en la misma base de datos, entonces no necesita definir el nombre de la base de datos, pero si está en otra base de datos, debe mencionar el nombre de la base de datos como ruta o le mostrará un error. Espero haberte facilitado el trabajo

Bha15
fuente
-2

Mientras tenía problemas para unir esas dos tablas, logré hacer exactamente lo que quería al abrir ambas bases de datos remotas al mismo tiempo. MySQL 5.6 (php 7.1) y el otro 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>";
}

Si obtiene esos dos OK en la pantalla, ambas bases de datos están abiertas y listas. Luego puede proceder a realizar sus consultas.

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

Estaba tratando de hacer algunas uniones, pero como abrí esas dos bases de datos, puedo ir y venir haciendo consultas simplemente cambiando la conexión $mysqli1o$mysqli2

Funcionó para mí, espero que ayude ... Saludos

Luis H Cabrejo
fuente
Supongo que nadie dijo que no usara php ... Tuve el mismo problema y pude resolverlo con algo de programación
Luis H Cabrejo