В двух разных базах данных на разных серверах есть две таблицы, мне нужно присоединиться к ним, чтобы сделать несколько запросов. Какие у меня варианты? Что мне делать?
Запрос данных путем объединения двух таблиц в две базы данных на разных серверах
Ответ 1
Вам нужно использовать sp_addlinkedserver
для создания ссылки на сервер. См. Справочную документацию для использования. После установления связи с сервером вы создадите запрос как обычно, просто префикс имени базы данных на другом сервере. То есть:
-- 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
может сэкономить время и производительность, если вы используете запрос для фильтрации некоторых данных.
Ответ 2
Попробуйте следующее:
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
Ответ 3
Если связанный сервер не разрешен вашей dba, вы можете использовать OPENROWSET. Books Online предоставит вам синтаксис.
Ответ 4
С практической точки зрения предприятия наилучшей практикой является создание зеркальной копии таблицы базы данных в вашей базе данных, а затем просто задача /proc обновлять ее с дельта каждый час.
Ответ 5
Объединение двух таблиц лучше всего выполняется с помощью СУБД, поэтому это должно быть сделано таким образом. Вы можете отобразить меньшую таблицу или ее подмножество в одной из баз данных, а затем присоединиться к ним. У вас может возникнуть соблазн сделать это на сервере ETL, таком как informatica, но я думаю, его не рекомендуется, если таблицы огромны.
Ответ 6
Я пробовал этот код ниже, и он отлично работает
SELECT TimeTrackEmployee.StaffID
FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
Ответ 7
Если ссылка на ссылку базы данных недоступна, другой маршрут, который вы можете предпринять, - это связать таблицы через ODBC с чем-то вроде отчетов MS Access или Crystal и присоединиться к ним.
Ответ 8
Вы можете попробовать следующее:
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
Ответ 9
Возможно, жестко закодированные имена баз данных не всегда подходят для SQL-запроса. Таким образом, добавление синонимов было бы лучшим подходом. Не всегда бывает, что базы данных имеют одинаковое имя в нескольких промежуточных средах. Они могут состоять из postfixes, таких как PROD, UAT, SIT, QA и т.д. Поэтому имейте в виду жестко запрограммированные запросы и сделайте их более динамичными.
Подход №1: Используйте синонимы для связывания таблиц между базами данных на одном сервере.
Подход №2: Собирайте данные отдельно от каждой базы данных и присоединяйтесь к ней в своем коде. Ваши строки подключения к базе данных могут быть частью конфигурации вашего App-сервера через базу данных или файл конфигурации.
Ответ 10
Когда у меня были проблемы с соединением этих двух таблиц, мне удавалось делать именно то, что я хотел, открывая обе удаленные базы данных одновременно. 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 user_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
Это сработало для меня, я надеюсь, что это помогает... Ура
Ответ 11
для этого просто следуйте ниже запросу
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
Где я написал имя базы данных, вам нужно определить имя базы данных. Если вы находитесь в одной базе данных, поэтому вам не нужно определять имя базы данных, но если вы находитесь в другой базе данных, вы должны указать имя базы данных как путь или она покажет вам ошибку. Надеюсь, я упростил вашу работу.