在不同服务器上的两个不同数据库中有两个表,我需要加入它们以便进行少量查询。我有什么选择?我该怎么办?
答案 0 :(得分:72)
您需要使用sp_addlinkedserver
来创建服务器链接。有关用法,请参阅reference documentation。建立服务器链接后,您将正常构建查询,只需在数据库名称前加上其他服务器。即:
-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
ON tab1.ID = tab2.ID
建立链接后,您还可以使用OPENQUERY
在远程服务器上执行SQL语句,并仅将数据传回给您。这可以更快一点,它将让远程服务器优化您的查询。如果您将数据缓存在上面示例中的DB1
上的临时(或内存)表中,那么您将能够像加入标准表一样查询它。例如:
-- 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
查看documentation for OPENQUERY以查看更多示例。上面的例子非常人为。我肯定会使用此特定示例中的第一个方法,但如果您使用查询过滤掉某些数据,则使用OPENQUERY
的第二个选项可以节省一些时间和性能。
答案 1 :(得分:8)
试试这个:
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
答案 2 :(得分:5)
如果您的dba不允许链接服务器,则可以使用OPENROWSET。联机丛书将提供您需要的语法。
答案 3 :(得分:4)
从实际的企业角度来看,最佳做法是在数据库中制作数据库表的镜像副本,然后让任务/ proc每小时更新一次delta。
答案 4 :(得分:1)
两个表的连接最好由DBMS完成,因此应该这样做。您可以在其中一个数据库上镜像较小的表或其子集,然后加入它们。有人可能会在ETL服务器上做这样的事情,比如informatica,但我想如果表格很大的话,这是不可取的。
答案 5 :(得分:1)
如果数据库链接选项不可用,您可以采取的另一种方法是通过ODBC将表链接到MS Access或Crystal报表等内容并在那里进行连接。
答案 6 :(得分:0)
我在下面尝试了这段代码并且工作正常
SELECT TimeTrackEmployee.StaffID
FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
答案 7 :(得分:0)
您可以尝试以下方法:
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
答案 8 :(得分:0)
也许硬编码的数据库名称并不是SQL查询中最好的方法。因此,添加同义词将是更好的方法。数据库在多个临时环境中具有相同的名称并非总是如此。它们可能包括PROD,UAT,SIT,QA等后缀。因此,请注意硬编码查询并使其更具动态性。
方法#1:使用同义词在同一服务器上的数据库之间链接表。
方法#2:从每个数据库中单独收集数据并将其加入代码中。您的数据库连接字符串可以通过数据库或配置文件成为App-server配置的一部分。
答案 9 :(得分:0)
虽然在连接这两个表时遇到麻烦,但我却无法通过同时打开两个远程数据库来完成我想要的事情。 MySQL 5.6(php 7.1)和其他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>";
}
如果屏幕上显示这两个确定,则两个数据库均已打开并准备就绪。然后,您可以继续进行查询。
$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();
我试图进行一些连接,但是由于我打开了这两个数据库,因此我可以通过更改连接$mysqli1
或$mysqli2
它为我工作,希望对您有帮助...干杯
答案 10 :(得分:-1)
为此,只需按照以下查询
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
在我编写databasename的地方,您必须定义数据库的名称。如果您在同一个数据库中,那么您不需要定义数据库名称,但如果您在其他数据库中,则必须提及数据库名称作为路径,否则它将显示错误。 希望我让你的工作轻松