4

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

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

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 岁且喜欢蓝色的学生? 两张桌子

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

4

9 回答 9

9

我已经用 MySQL、Oracle 和 SQL 服务器做到了这一点。您可以创建从中央 MSSQL 服务器到 Oracle 和其他 MSSQL 服务器的链接服务器。然后,您可以直接使用链接服务器查询对象,也可以在数据库中创建链接服务器表的同义词。

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

  1. 在您的“主”MSSQL 服务器上,创建两个链接服务器到包含两个数据库的服务器,或者如您所说的数据库 A 和数据库 B。
  2. 然后,您可以使用普通的 TSQL 选择语句直接查询链接服务器上的表。

要创建与 Oracle 的链接服务器,请参阅此链接:http: //support.microsoft.com/kb/280106

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

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

SELECT *
FROM Linkedserver.database.schema.table

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

SELECT *
FROM DBTable1

如果您的链接服务器发生更改,它可以节省一些打字时间,您不需要对您的代码进行更改。就像我说的那样,如果您在大量代码中使用链接服务器,这真的很有好处。

更要注意的是,您可以在不同服务器上的两个表之间进行连接。然而,这通常非常缓慢。我发现您可以将来自不同服务器的数据选择到临时表中,加入临时表通常可以加快速度。您的里程可能会有所不同,但如果您要加入不同服务器上的表,此技术会有所帮助。

如果您需要更多详细信息,请告诉我。

于 2013-01-23T10:18:48.780 回答
2

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

于 2013-01-15T19:17:46.790 回答
1

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

因此,并不简单。如果你能让 Namphibian 的方法奏效,那就去吧。

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

高温高压

于 2013-01-25T19:51:26.403 回答
0

尝试在 Visual Studio 中创建 3 个 Linq 查询。一种用于 SQL Server,一种用于 Oracle,另一种用于组合 2 个数据库对象。

于 2013-01-15T19:33:31.220 回答
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'
于 2013-01-15T19:17:49.193 回答
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.

于 2013-01-15T19:19:13.370 回答
0

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

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

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

但是你提到了连接字符串,所以我很好奇你是否想用一种像 .NET 这样的代码方法来做呢?我也可以提供一个想法。

于 2013-01-22T21:27:14.747 回答
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>";
}

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

在您的具体问题上,我将首先从数据库 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

它对我有用,我希望它有帮助......干杯

于 2018-12-19T17:28:48.090 回答
-1

只要两个数据库都在同一个服务器中,您就可以使用数据库名称引用表:)

SELECT * FROM db1.table1
join 
db2.tbable2 
WHERE db1.table1.col1 = db2.table2.col1;
于 2013-01-15T19:21:35.607 回答