【问题标题】:Querying data by joining two tables in two database on different servers通过连接不同服务器上两个数据库中的两个表来查询数据
【发布时间】:2011-07-05 23:05:57
【问题描述】:

在不同服务器上的两个不同数据库中有两个表,我需要将它们连接起来以便进行少量查询。我有什么选择?我该怎么办?

【问题讨论】:

  • 就像 PRAMP 把你带到这里来一样
  • @JanacMeena 什么是 PRAMP?您可以分享指向您所指内容的链接吗?
  • @theprogrammer pramp.com

标签: sql sql-server database sql-server-2005 sql-server-2008


【解决方案1】:

虽然我在加入这两个表时遇到了麻烦,但我通过同时打开两个远程数据库来完成我想要做的事情。 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>";
}

如果您在屏幕上获得这两个 OK,则两个数据库都已打开并准备就绪。然后您可以继续进行查询。

$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...我有同样的问题,我可以通过一些编程来解决它
【解决方案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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      您可以尝试以下方法:

      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
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 答案应该是通用的,而不仅仅是您的用例的复制粘贴。此外,这对提出问题的用户没有帮助。
        【解决方案6】:

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

        【讨论】:

          【解决方案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
          

          【讨论】:

            【解决方案8】:

            从实际的企业角度来看,最佳做法是在您的数据库中制作数据库表的镜像副本,然后让任务/proc 每小时使用 delta 更新一次。

            【讨论】:

              【解决方案9】:

              您需要使用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 的第二种方法可以节省一些时间和性能。

              【讨论】:

              • php-mysql 是否可行 ..如果可以,您能否建议我如何使用该选项成长?
              • 我不知道 MySQL 是否支持链接服务器。此答案特定于 Microsoft SQL 服务器。
              • 如果有人在寻找 PostgreSQL 的答案,试试这个:postgresql.org/docs/9.4/static/postgres-fdw.html
              【解决方案10】:

              两个表的连接最好由 DBMS 完成,所以应该这样做。您可以在其中一个数据库上镜像较小的表或它的子集,然后加入它们。人们可能会想在像 informatica 这样的 ETL 服务器上执行此操作,但我想如果表很大,则不建议这样做。

              【讨论】:

                【解决方案11】:

                如果您的 dba 不允许链接服务器,您可以使用 OPENROWSET。 Books Online 将提供您需要的语法。

                【讨论】:

                  猜你喜欢
                  • 2018-02-05
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-10-23
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-01-12
                  相关资源
                  最近更新 更多