Запит даних за допомогою з'єднання двох таблиць у двох базах даних на різних серверах


102

Є дві таблиці в двох різних базах даних на різних серверах, мені потрібно приєднатись до них, щоб зробити кілька запитів. Які у мене варіанти? Що я повинен зробити?


Наче, якби PRAMP привів вас сюди
Джанак Мена,

Відповіді:


86

Вам потрібно буде використовувати 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може заощадити деякий час та продуктивність, якщо ви використовуєте запит для фільтрації деяких даних.


1
це можливо з php-mysql .. якщо так, то, будь ласка, підкажете, будь ласка, мені спосіб, як я можу рости з цим варіантом?
Jhanvi

1
Я поняття не маю, чи підтримує MySQL пов'язані сервери. Ця відповідь характерна для сервера Microsoft SQL.
Скотт Андерсон

3
Якщо хтось шукає відповідь на PostgreSQL, спробуйте це: postgresql.org/docs/9.4/static/postgres-fdw.html
PJSCopeland


5

Якщо пов’язаний сервер заборонений вашим dba, ви можете використовувати OPENROWSET. Книги в Інтернеті нададуть потрібний вам синтаксис.


4

З точки зору практичної діяльності, найкращою практикою є виготовлення дзеркальної копії таблиці бази даних у вашій базі даних, а потім просто мати завдання / proc оновлювати її дельтою щогодини.


1

З'єднання двох таблиць найкраще здійснювати СУБД, тому це слід робити так. Ви можете відобразити меншу таблицю або її підмножину в одній із баз даних, а потім приєднатись до них. Можна спокуситися робити це на сервері ETL, наприклад, інформатика, але я думаю, що це не доцільно, якщо таблиці величезні.


1

Якщо параметр посилання на базу даних недоступний, інший маршрут, який ви можете взяти, - це прив’язати таблиці через ODBC до чогось, наприклад, MS Access або Crystal звітів, і зробити з'єднання там.


0

Можливо, жорстко кодовані імена баз даних не є найкращим підходом завжди у SQL-запиті. Таким чином, додавання синонімів було б кращим підходом. Не завжди буває так, що бази даних мають одне ім’я в декількох середовищах. Вони можуть складатися з постфіксів типу PROD, UAT, SIT, QA тощо. Тому будьте в курсі жорстких запитів і зробіть їх більш динамічними.

Підхід №1: Використовуйте синоніми для зв’язку таблиць між базами даних на одному сервері.

Підхід №2: збирайте дані окремо від кожної бази даних та приєднуйте їх до свого коду. Рядки підключення до бази даних можуть бути частиною конфігурації вашого сервера додатків через базу даних або конфігураційний файл.


-2

Я спробував цей код нижче, і він працює чудово

SELECT        TimeTrackEmployee.StaffID
FROM            dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
                         TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID

Відповіді мають бути загальними, а не лише копіювальною пастою ваших випадків використання. Також це не допомагає користувачеві, який поставив запитання.
Володимир Грамачо

-2

Ви можете спробувати наступне:

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

-2

для цього просто дотримуйтесь нижче запиту

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

Де я написав ім'я бази даних, ви повинні визначити ім'я бази даних. Якщо ви перебуваєте в одній базі даних, тому вам не потрібно визначати ім'я бази даних, але якщо ви перебуваєте в іншій базі даних, ви повинні вказати ім'я бази даних як шлях, або це покаже вам помилку. Сподіваюся, я полегшив вашу роботу


-2

Поки я мав проблеми приєднатись до цих двох таблиць, я пішов із виконання саме того, що хотів, відкривши обидві віддалені бази даних одночасно. 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

Це працювало на мене, я сподіваюся, що це допомагає ... Ура


Напевно, ніхто не сказав не використовувати php ... У мене була така ж проблема, і я зміг вирішити це за допомогою деякого програмування
Луїс Х Кабреджо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.