通过联接不同服务器上两个数据库中的两个表来查询数据


Answers:


86

您需要用于sp_addlinkedserver创建服务器链接。有关用法,请参见参考文档。建立服务器链接后,您将像平常一样构造查询,只需在数据库名称前加上其他服务器即可。IE浏览器:

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

查看OPENQUERY文档以查看更多示例。上面的示例非常人为。我肯定会在此特定示例中使用第一种方法,但是OPENQUERY如果您使用查询过滤掉一些数据,则第二种使用方法可以节省一些时间和性能。


1
php-mysql是否有可能..如果是,那么您能建议我一种如何使用该选项进行扩展的方法吗?
詹维,2012年

1
我不知道MySQL是否支持链接服务器。此答案特定于Microsoft SQL Server。
Scott Anderson

3
如果有人在寻找PostgreSQL的答案,请尝试以下方法:postgresql.org/docs/9.4/static/postgres-fdw.html
PJSCopeland 2015年

7

试试这个:

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

5

如果您的dba不允许链接服务器,则可以使用OPENROWSET。联机丛书将提供您所需的语法。


4

从实际的企业角度来看,最佳实践是在数据库中创建数据库表的镜像副本,然后仅执行任务/过程以每小时更新一次delta。


1

由DBMS最好将两个表连接起来,因此应采用这种方式。您可以在一个数据库中镜像较小的表或表的子集,然后将它们联接。有人可能会喜欢在像informatica这样的ETL服务器上执行此操作,但我认为如果表很大,则不建议这样做。


1

如果数据库链接选项不可用,您可以采取的另一种方法是通过ODBC将表链接到诸如MS Access或Crystal报表之类的东西,然后在其中进行联接。


0

也许硬编码的数据库名称并不是在SQL查询中总是最好的方法。因此,添加同义词将是更好的方法。在多个登台环境中,数据库并非总是具有相同的名称。它们可能由PROD,UAT,SIT,QA等后缀组成。因此,请注意硬编码的查询并使它们更具动态性。

方法1:使用同义词链接同一服务器上数据库之间的表。

方法2:从每个数据库中分别收集数据,并将其加入代码中。您的数据库连接字符串可以通过数据库或配置文件成为应用服务器配置的一部分。


-2

我在下面尝试了这段代码,它工作正常

SELECT        TimeTrackEmployee.StaffID
FROM            dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
                         TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID

答案应该是通用的,而不仅仅是复制用例。另外,这对提出问题的用户没有帮助。
弗拉基米尔·格拉玛乔

-2

您可以尝试以下方法:

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

-2

为此,只需遵循以下查询

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

在我写数据库名称的地方,必须定义数据库的名称。如果您在同一数据库中,则无需定义数据库名称,但是如果您在其他数据库中,则必须提及数据库名称作为路径,否则它将显示错误。希望我让你的工作轻松


-2

当我在连接这两个表时遇到麻烦时,我无法通过同时打开两个远程数据库来完成我想要的事情。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

它对我有用,希望对您有帮助...


我想没有人说不能用PHP ...我有同样的问题,我能够有一定编程来解决这个问题
路易斯^ h Cabrejo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.