Farklı sunucularda iki farklı veritabanında iki tablo var, birkaç sorgu yapabilmek için onları birleştirmem gerekiyor. Hangi seçeneklere sahibim? Ne yapmalıyım?
Yanıtlar:
sp_addlinkedserver
Bir sunucu bağlantısı oluşturmak için kullanmanız gerekecek . Kullanım için referans belgelerine bakın . Sunucu bağlantısı kurulduktan sonra, sorguyu normal bir şekilde oluşturacak, sadece veritabanı adını diğer sunucunun önüne koyacaksınız. IE:
-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
ON tab1.ID = tab2.ID
Bağlantı kurulduktan sonra, OPENQUERY
uzak sunucuda bir SQL ifadesi yürütmek ve yalnızca verileri size geri aktarmak için de kullanabilirsiniz. Bu biraz daha hızlı olabilir ve uzak sunucunun sorgunuzu optimize etmesine izin verir. Verileri DB1
yukarıdaki örnekte geçici (veya bellek içi) bir tabloda önbelleğe alırsanız , standart bir tabloya katılır gibi sorgulayabilirsiniz. Örneğin:
-- 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
Check out OPENQUERY belgelerine biraz daha örnekleri görmek için. Yukarıdaki örnek oldukça uydurma. Bu özel örnekte kesinlikle ilk yöntemi kullanırdım, ancak OPENQUERY
bazı verileri filtrelemek için sorguyu kullanırsanız, ikinci seçeneği kullanmak biraz zaman ve performans tasarrufu sağlayabilir.
Bunu dene:
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
İki tablonun birleştirilmesi en iyi şekilde bir DBMS tarafından yapılır, bu nedenle bu şekilde yapılmalıdır. Daha küçük tabloyu veya bunun alt kümesini veritabanlarından birine yansıtabilir ve sonra onlara birleştirebilirsiniz. Bunu informatica gibi bir ETL sunucusunda yapmak cazip gelebilir, ancak tabloların çok büyük olması tavsiye edilmez sanırım.
Belki de sabit kodlanmış veritabanı adları bir SQL sorgusu içinde her zaman en iyi yaklaşım değildir. Bu nedenle, eş anlamlılar eklemek daha iyi bir yaklaşım olacaktır. Veritabanlarının birkaç hazırlık ortamında aynı ada sahip olması her zaman geçerli değildir. PROD, UAT, SIT, QA vb. Gibi postfixlerden oluşabilir. Bu nedenle, sabit kodlanmış sorgulara dikkat edin ve onları daha dinamik hale getirin.
Yaklaşım # 1: Aynı sunucudaki veritabanları arasında tabloları birbirine bağlamak için eş anlamlıları kullanın.
Yaklaşım 2: Verileri her veritabanından ayrı ayrı toplayın ve kodunuzda birleştirin. Veritabanı bağlantı dizeleriniz, bir veritabanı veya bir yapılandırma dosyası aracılığıyla Uygulama sunucusu yapılandırmanızın bir parçası olabilir.
Aşağıdaki kodu denedim ve iyi çalışıyor
SELECT TimeTrackEmployee.StaffID
FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
Aşağıdakileri deneyebilirsiniz:
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
bunun için aşağıdaki sorguyu takip etmeniz yeterlidir
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
Veritabanının adını yazdığım yerde, veritabanının adını tanımlamanız gerekir. Aynı veritabanındaysanız, bu nedenle veritabanı adını tanımlamanız gerekmez, ancak başka bir veritabanındaysanız, veritabanı adını yol olarak belirtmeniz gerekir, aksi takdirde hata gösterilir. Umarım işini kolaylaştırmışımdır
Bu iki masaya katılmakta zorlanırken, her iki uzak veritabanını aynı anda açarak tam olarak istediğimi yapmaktan kurtuldum. MySQL 5.6 (php 7.1) ve diğer 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>";
}
Ekranda bu iki Tamam'ı görürseniz, her iki veritabanı da açık ve hazırdır. Daha sonra sorgularınızı yapmaya devam edebilirsiniz.
$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();
Bazı birleştirmeler yapmaya çalışıyordum, ancak bu iki DB'yi açtığım için, yalnızca bağlantıyı değiştirerek ileri geri sorgulama yapabilirim $mysqli1
veya$mysqli2
Benim için çalıştı, umarım yardımcı olur ... Şerefe