我实际上并不想修改任何一个数据库,只是获取数据。
我知道如何使用这些连接字符串单独连接到每个数据库:
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,但不是相反。
答案 0 :(得分:8)
我用MySQL,Oracle和SQL服务器完成了这项工作。您可以从中央MSSQL服务器到Oracle和其他MSSQL服务器创建链接服务器。然后,您可以使用链接服务器直接查询对象,也可以创建数据库中链接服务器表的同义词。
创建和使用链接服务器的步骤如下:
要创建到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;