Zapytanie o dane poprzez połączenie dwóch tabel w dwóch bazach danych na różnych serwerach

102

Istnieją dwie tabele w dwóch różnych bazach danych na różnych serwerach, muszę do nich dołączyć, aby wykonać kilka zapytań. Jakie mam opcje? Co powinienem zrobić?

Kashif
źródło
1
Jakby PRAMP cię tu
przywiózł

Odpowiedzi:

86

Będziesz musiał użyć, sp_addlinkedserveraby utworzyć łącze do serwera. Zobacz dokumentację referencyjną dotyczącą użytkowania. Po ustanowieniu połączenia z serwerem zapytanie zostanie utworzone w normalny sposób, po prostu poprzedzając nazwę bazy danych innym serwerem. TO ZNACZY:

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

Po ustanowieniu połączenia możesz również użyć OPENQUERYdo wykonania instrukcji SQL na serwerze zdalnym i przesłania tylko danych z powrotem do Ciebie. Może to być nieco szybsze i pozwoli zdalnemu serwerowi zoptymalizować zapytanie. Jeśli zbuforujesz dane w tabeli tymczasowej (lub w pamięci) DB1w powyższym przykładzie, będziesz mógł wykonać zapytanie tak samo, jak dołączając do standardowej tabeli. Na przykład:

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

Sprawdź dokumentację OPENQUERY, aby zobaczyć więcej przykładów. Powyższy przykład jest dość wymyślony. Zdecydowanie użyłbym pierwszej metody w tym konkretnym przykładzie, ale druga opcja OPENQUERYmoże zaoszczędzić trochę czasu i wydajności, jeśli użyjesz zapytania do odfiltrowania niektórych danych.

Scott Anderson
źródło
1
czy jest to możliwe z php-mysql .. jeśli tak, to czy możesz mi zasugerować sposób, w jaki mogę się rozwijać z tą opcją?
Jhanvi
1
Nie mam pojęcia, czy MySQL obsługuje połączone serwery. Ta odpowiedź jest specyficzna dla serwera Microsoft SQL.
Scott Anderson
3
Jeśli ktoś szuka odpowiedzi na PostgreSQL, spróbuj tego: postgresql.org/docs/9.4/static/postgres-fdw.html
PJSCopeland
7

Spróbuj tego:

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 i Kapil Jangid
źródło
5

Jeśli serwer połączony nie jest dozwolony przez twoją dba, możesz użyć OPENROWSET. Books Online zapewni potrzebną składnię.

HLGEM
źródło
4

Z praktycznego punktu widzenia przedsiębiorstwa, najlepszą praktyką jest utworzenie lustrzanej kopii tabeli bazy danych w bazie danych, a następnie po prostu zadanie / proc aktualizuje ją co godzinę o wartości delta.

Dave
źródło
1

Połączenie dwóch tabel najlepiej wykonać za pomocą DBMS, więc należy to zrobić w ten sposób. Możesz wykonać kopię lustrzaną mniejszej tabeli lub jej podzbioru w jednej z baz danych, a następnie dołączyć do nich. Można by się pokusić o zrobienie tego na serwerze ETL, takim jak informatica, ale myślę, że nie jest to zalecane, jeśli tabele są ogromne.

Abdulmoeed
źródło
1

Jeśli opcja łącza do bazy danych nie jest dostępna, inną drogą, którą można wybrać, jest połączenie tabel za pośrednictwem ODBC z czymś, na przykład raportami MS Access lub Crystal, i wykonanie połączenia w tym miejscu.

Docisk
źródło
0

Być może zakodowane na stałe nazwy baz danych nie zawsze są najlepszym podejściem w ramach zapytania SQL. Dlatego lepszym podejściem byłoby dodanie synonimów. Nie zawsze jest tak, że bazy danych mają tę samą nazwę w kilku środowiskach przejściowych. Mogą składać się z postfiksów, takich jak PROD, UAT, SIT, QA i tak dalej. Dlatego uważaj na zapytania zakodowane na stałe i nadaj im większą dynamikę.

Podejście nr 1: użyj synonimów, aby połączyć tabele między bazami danych na tym samym serwerze.

Podejście nr 2: Zbierz dane oddzielnie z każdej bazy danych i dołącz je do swojego kodu. Parametry połączenia z bazą danych mogą być częścią konfiguracji serwera aplikacji za pośrednictwem bazy danych lub pliku konfiguracyjnego.

Niklas Henricson
źródło
-2

Wypróbowałem ten kod poniżej i działa dobrze

SELECT        TimeTrackEmployee.StaffID
FROM            dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
                         TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
Quang Ninh
źródło
Odpowiedzi powinny być ogólne, a nie tylko kopiować i wklejać przypadki użycia. Nie pomaga to również użytkownikowi, który zadał pytanie.
Wladimir Gramacho
-2

Możesz spróbować następujących rzeczy:

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
źródło
-2

w tym celu po prostu wykonaj poniższe zapytanie

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

Tam, gdzie napisałem nazwę bazy danych, musisz zdefiniować nazwę bazy danych. Jeśli jesteś w tej samej bazie danych, więc nie musisz definiować nazwy bazy danych, ale jeśli jesteś w innej bazie, musisz podać nazwę bazy danych jako ścieżkę lub wyświetli się błąd. Mam nadzieję, że ułatwiłem ci pracę

Bha15
źródło
-2

Podczas gdy miałem problemy z dołączeniem do tych dwóch tabel, udało mi się zrobić dokładnie to, co chciałem, otwierając obie zdalne bazy danych w tym samym czasie. MySQL 5.6 (php 7.1) i inne 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>";
}

Jeśli zobaczysz te dwa OK na ekranie, to obie bazy danych są otwarte i gotowe. Następnie możesz przystąpić do zadawania pytań.

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

Próbowałem wykonać kilka połączeń, ale ponieważ otworzyłem te dwie bazy danych, mogę przechodzić tam iz powrotem, wykonując zapytania, po prostu zmieniając połączenie $mysqli1lub$mysqli2

Pomogło mi, mam nadzieję, że pomogło ... Pozdrawiam

Luis H Cabrejo
źródło
Chyba nikt nie powiedział, żeby nie używać php ... Miałem ten sam problem i udało mi się go rozwiązać za pomocą jakiegoś programowania
Luis H Cabrejo