如何使用一个SELECT语句从两个服务器中的两个数据库中获取数据?

时间:2013-01-15 19:15:44

标签: sql database oracle select

我实际上并不想修改任何一个数据库,只是获取数据。

我知道如何使用这些连接字符串单独连接到每个数据库:

Provider=SQLOLEDB.1;Data Source={0};Initial Catalog={1};Integrated Security=SSPI;Persist Security Info=False;

Provider=OraOLEDB.Oracle.1;Data Source={0};User ID={1};Password={2};Persist Security Info=True;

但是如何将这些重叠数据放在一起呢?这是否可能,特别是考虑到一个是 Oracle 而另一个是 SQL Server ?或者最好是单独对每个数据库执行SELECT语句,然后在之后匹配它们?


例如,我如何让所有10岁的学生都喜欢蓝色? two tables

请注意,DatabaseB中的所有项目都有一个映射到DatabaseA的ID,但不是相反。

8 个答案:

答案 0 :(得分:8)

我用MySQL,Oracle和SQL服务器完成了这项工作。您可以从中央MSSQL服务器到Oracle和其他MSSQL服务器创建链接服务器。然后,您可以使用链接服务器直接查询对象,也可以创建数据库中链接服务器表的同义词。

创建和使用链接服务器的步骤如下:

  1. 在“主”MSSQL服务器上,为包含两个数据库的服务器创建两个链接服务器,或者如您所说的数据库A和数据库B一样。
  2. 然后,您可以使用纯TSQL选择语句直接查询链接服务器上的表。
  3. 要创建到Oracle的链接服务器,请参阅以下链接:http://support.microsoft.com/kb/280106

    关于同义词的更多信息。如果您要在大量查询中使用这些链接服务器表,那么使用同义词来帮助维护代码可能是值得的。同义词允许您以不同的名称引用某些内容。

    因此,例如,当从链接服务器中选择数据时,通常使用以下语法来获取数据:

    SELECT *
    FROM Linkedserver.database.schema.table
    

    如果您将Linkedserver.database.schema.table的同义词创建为DBTable1,则语法为:

    SELECT *
    FROM DBTable1
    

    如果您的链接服务器发生了变化,它可以节省一些打印费用,您不需要在代码中进行更改。就像我说的那样,如果你在很多代码中使用链接服务器,这确实是有益的。

    更谨慎的是,您可以在不同服务器上的两个表之间进行连接。这通常很痛苦。我发现你可以从不同的服务器中选择数据到临时表中,加入临时表通常可以加快速度。您的milage可能会有所不同,但如果您要加入不同服务器上的表,这种技术可以提供帮助。

    如果您需要更多详细信息,请与我们联系。

答案 1 :(得分:2)

您使用的是哪个数据库?大多数数据库都带有名为dblinks的概念。您必须在数据库A中创建数据库B的dblink,然后您可以创建同义词(不是必须但是为了方便)并使用它,就像它是数据库A的表一样。

答案 2 :(得分:1)

看起来像异构连接(不同服务器/技术上的数据等)。

因此,不是直截了当的。如果你能让Namphibian的方法发挥作用,那就这样吧。

否则,您需要将两个表中的数据收集到一个公共位置(一个或另一个正在运行的服务器),或者仅用于协同定位数据的第三个服务器/技术。然后,您可以愉快地加入数据。许多ETL工具以这种方式工作,这种情况(几乎)总是涉及在加入之前将一个或多个表重新分配到公共​​位置。 Oracle Data Integrator ETL工具执行此操作,Talend Open Studio的tJoin组件也是如此。

HTH

答案 3 :(得分:0)

SELECT (things)
FROM databaseA.dbo.table t1
INNER JOIN databaseB.dbo.table t2 ON t1.Col1 = t2.Col2
WHERE t1.Col1 = 'something'

编辑 - 此声明应符合新要求:

SELECT *
FROM databaseA.dbo.table t1
INNER JOIN databaseB.dbo.table t2 ON t1.ID = t2.ID
WHERE t1.Age = 10 AND t2.FavoriteColor = 'Blue'

答案 4 :(得分:0)

假设数据库位于同一台服务器上,您应该可以执行以下操作:

SELECT t.field1, t.field2
FROM database.schema.table t
JOIN database2.scheme.table2 t2 
   on t.id = t2.id
WHERE t2.field3 = ...

如果数据库位于不同的服务器上,请查看使用Linked Servers

答案 5 :(得分:0)

如果你想从两个不同的服务器和数据库中选择数据,我会做一个联合而不是一个联接,因为一个数据可能像苹果一样,另一个可能像橙子一样。您仍然需要设置链接服务器,我相信如果在显示的某些版本之后您可以链接Oracle和SQL Server,但您可以执行以下操作:

select ColA, ColB, ColC
from (ServerASQLServer).(DatabaseA).(schema).(table)
UNION
select ColA, ColB, ColC
from (ServerBOracleServer).(DatabaseB).(schema).(table)

如果执行内部联接,则数据必须共享要绑定的数据类型,否则将从返回的数据集中省略它们。联合必须只共享列数据类型,但不关心逻辑。你实质上在说:“根据列逻辑匹配将这两组不同的行放在一起。”

但是你提到了连接字符串,所以我很想知道你是否想要用.NET这样的代码方法来实现它?我也可以为此提供一个想法。

答案 6 :(得分: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>";
}

如果屏幕上显示这两个确定,则两个数据库均已打开并准备就绪。然后,您可以继续进行查询。

关于您的特定问题,我将执行类似的操作,首先从数据库A中选择所有10岁的孩子,然后通过数据库B中的ID将它们与颜色匹配。应该可以,我没有在服务器上测试此代码,但是我下面的代码示例工作。您可以自定义查询内容,包括任何颜色,年龄,任何内容,甚至可以根据需要对其进行分组。

$results = $mysqli1->query("SELECT * FROM DatabaseTableA where age=10");
    while($row = $results->fetch_array()) {
        $theColorID = $row[0];
        $theName = $row[1];
        $theAge = $row[2];
        echo "Kid Color ID : ".$theColorID." ".$theName." ".$theAge."<br>";
        $doSelectColor = $mysqli2->query("SELECT * FROM DatabaseTableB where favorite_color=".$theColorID." "); 
        while($row = $doSelectColor->fetch_assoc()) {
            echo "Kid Favorite Color : ".$row["favorite_color"]."<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

来回进行查询。

它为我工作,希望对您有帮助...干杯

答案 7 :(得分:-1)

只要两个数据库位于同一服务器中,您就可以引用具有数据库名称的表:)

SELECT * FROM db1.table1
join 
db2.tbable2 
WHERE db1.table1.col1 = db2.table2.col1;