Відповіді:
Вам потрібно буде використовувати sp_addlinkedserver
для створення посилання на сервер. Див. Довідкову документацію щодо використання. Після встановлення посилання на сервер ви будете конструювати запит як звичайний, просто префіксуючи ім'я бази даних з іншим сервером. IE:
-- 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
може заощадити деякий час та продуктивність, якщо ви використовуєте запит для фільтрації деяких даних.
Спробуйте це:
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
З'єднання двох таблиць найкраще здійснювати СУБД, тому це слід робити так. Ви можете відобразити меншу таблицю або її підмножину в одній із баз даних, а потім приєднатись до них. Можна спокуситися робити це на сервері ETL, наприклад, інформатика, але я думаю, що це не доцільно, якщо таблиці величезні.
Можливо, жорстко кодовані імена баз даних не є найкращим підходом завжди у SQL-запиті. Таким чином, додавання синонімів було б кращим підходом. Не завжди буває так, що бази даних мають одне ім’я в декількох середовищах. Вони можуть складатися з постфіксів типу PROD, UAT, SIT, QA тощо. Тому будьте в курсі жорстких запитів і зробіть їх більш динамічними.
Підхід №1: Використовуйте синоніми для зв’язку таблиць між базами даних на одному сервері.
Підхід №2: збирайте дані окремо від кожної бази даних та приєднуйте їх до свого коду. Рядки підключення до бази даних можуть бути частиною конфігурації вашого сервера додатків через базу даних або конфігураційний файл.
Я спробував цей код нижче, і він працює чудово
SELECT TimeTrackEmployee.StaffID
FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
Ви можете спробувати наступне:
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
для цього просто дотримуйтесь нижче запиту
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
Де я написав ім'я бази даних, ви повинні визначити ім'я бази даних. Якщо ви перебуваєте в одній базі даних, тому вам не потрібно визначати ім'я бази даних, але якщо ви перебуваєте в іншій базі даних, ви повинні вказати ім'я бази даних як шлях, або це покаже вам помилку. Сподіваюся, я полегшив вашу роботу
Поки я мав проблеми приєднатись до цих двох таблиць, я пішов із виконання саме того, що хотів, відкривши обидві віддалені бази даних одночасно. 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 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
Це працювало на мене, я сподіваюся, що це допомагає ... Ура