Membuat kueri data dengan menggabungkan dua tabel dalam dua database di server yang berbeda

102

Ada dua tabel dalam dua database berbeda di server yang berbeda, saya perlu menggabungkannya untuk membuat beberapa pertanyaan. Opsi apa yang saya miliki? Apa yang harus saya lakukan?

Kashif
sumber
1
Seperti jika PRAMP membawamu ke sini
Janac Meena

Jawaban:

86

Anda harus menggunakan sp_addlinkedserveruntuk membuat tautan server. Lihat dokumentasi referensi untuk penggunaan. Setelah tautan server dibuat, Anda akan membuat kueri seperti biasa, hanya memberi awalan nama database dengan server lain. YAITU:

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

Setelah tautan dibuat, Anda juga dapat menggunakan OPENQUERYpernyataan SQL di server jarak jauh dan hanya mentransfer datanya kembali kepada Anda. Ini bisa sedikit lebih cepat, dan ini akan membiarkan server jarak jauh mengoptimalkan kueri Anda. Jika Anda menyimpan data dalam cache dalam tabel sementara (atau dalam memori) pada DB1contoh di atas, maka Anda akan dapat menanyakannya seperti bergabung dengan tabel standar. Sebagai contoh:

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

Lihat dokumentasi OPENQUERY untuk melihat beberapa contoh lainnya. Contoh di atas cukup dibuat-buat. Saya pasti akan menggunakan metode pertama dalam contoh khusus ini, tetapi penggunaan opsi kedua OPENQUERYdapat menghemat waktu dan kinerja jika Anda menggunakan kueri untuk menyaring beberapa data.

Scott Anderson
sumber
1
apakah mungkin dengan php-mysql .. jika ya, bisakah Anda menyarankan saya cara bagaimana saya bisa tumbuh dengan opsi itu?
Jhanvi
1
Saya tidak tahu apakah MySQL mendukung server tertaut. Jawaban ini khusus untuk server Microsoft SQL.
Scott Anderson
3
Jika ada yang mencari jawaban PostgreSQL, coba ini: postgresql.org/docs/9.4/static/postgres-fdw.html
PJSCopeland
7

Coba ini:

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 dan kapil jangid
sumber
5

Jika server tertaut tidak diizinkan oleh dba Anda, Anda dapat menggunakan OPENROWSET. Books Online akan menyediakan sintaks yang Anda butuhkan.

HLGEM
sumber
4

Dari perspektif perusahaan praktis, praktik terbaik adalah membuat salinan cermin dari tabel database di database Anda, dan kemudian cukup tugas / proc memperbaruinya dengan delta setiap jam.

Dave
sumber
1

Gabungan dua tabel paling baik dilakukan oleh DBMS, jadi harus dilakukan seperti itu. Anda dapat mencerminkan tabel atau subset yang lebih kecil di salah satu database dan kemudian menggabungkannya. Orang mungkin tergoda untuk melakukan ini di server ETL seperti informatica tetapi saya kira itu tidak disarankan jika tabelnya besar.

Abdulmoeed
sumber
1

Jika opsi tautan database tidak tersedia, rute lain yang bisa Anda ambil adalah menautkan tabel melalui ODBC ke sesuatu seperti MS Access atau laporan Crystal dan melakukan penggabungan di sana.

Pegangan erat
sumber
0

Mungkin nama database yang di-hardcode bukanlah pendekatan terbaik yang selalu ada dalam kueri SQL. Jadi, menambahkan sinonim akan menjadi pendekatan yang lebih baik. Tidak selalu terjadi bahwa database memiliki nama yang sama di beberapa lingkungan pementasan. Mereka mungkin terdiri dari postfix seperti PROD, UAT, SIT, QA dan sebagainya. Jadi berhati-hatilah dengan kueri kode keras dan buat mereka lebih dinamis.

Pendekatan # 1: Gunakan sinonim untuk menghubungkan tabel antar database di server yang sama.

Pendekatan # 2: Kumpulkan data secara terpisah dari setiap database dan gabungkan ke dalam kode Anda. String koneksi database Anda bisa menjadi bagian dari konfigurasi server aplikasi Anda melalui database atau file konfigurasi.

Niklas Henricson
sumber
-2

Saya mencoba kode ini di bawah dan berfungsi dengan baik

SELECT        TimeTrackEmployee.StaffID
FROM            dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
                         TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
Quang Ninh
sumber
Jawaban harus bersifat umum, bukan hanya salinan-tempel kasus penggunaan Anda. Selain itu, ini tidak membantu pengguna yang membuat pertanyaan.
Wladimir Gramacho
-2

Anda bisa mencoba yang berikut ini:

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

untuk ini cukup ikuti kueri di bawah ini

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

Di mana saya menulis nama databasename, Anda harus menentukan nama database. Jika Anda berada di database yang sama maka Anda tidak perlu menentukan nama database tetapi jika Anda berada di database lain Anda harus menyebutkan nama database sebagai jalur atau akan muncul kesalahan. Semoga saya membuat pekerjaan Anda mudah

Bha15
sumber
-2

Ketika saya mengalami kesulitan untuk bergabung dengan dua tabel tersebut, saya berhasil melakukan apa yang saya inginkan dengan membuka kedua database jarak jauh pada saat yang bersamaan. MySQL 5.6 (php 7.1) dan MySQL 5.1 lainnya (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>";
}

Jika Anda mendapatkan dua OK itu di layar, maka kedua database tersebut terbuka dan siap. Kemudian Anda dapat melanjutkan untuk melakukan kueri Anda.

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

Saya mencoba melakukan beberapa penggabungan tetapi karena saya membuka kedua DB tersebut, maka saya dapat bolak-balik melakukan kueri hanya dengan mengubah koneksi $mysqli1atau$mysqli2

Ini berhasil untuk saya, saya harap ini membantu ... Cheers

Luis H Cabrejo
sumber
Saya kira tidak ada yang mengatakan untuk tidak menggunakan php ... Saya memiliki masalah yang sama dan saya dapat menyelesaikannya dengan beberapa pemrograman
Luis H Cabrejo