Запрос данных путем объединения двух таблиц в две базы данных на разных серверах - PullRequest
87 голосов
/ 28 февраля 2011

Есть две таблицы в двух разных базах данных на разных серверах, мне нужно объединить их, чтобы сделать несколько запросов.Какие варианты у меня есть?Что мне делать?

Ответы [ 11 ]

72 голосов
/ 28 февраля 2011

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

8 голосов
/ 13 марта 2013

Попробуйте это:

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
5 голосов
/ 28 февраля 2011

Если связанный сервер не разрешен вашим dba, вы можете использовать OPENROWSET.Books Online предоставит необходимый вам синтаксис.

4 голосов
/ 15 ноября 2012

С практической точки зрения предприятия лучше всего создать зеркальную копию таблицы базы данных в вашей базе данных, а затем просто выполнить задачу / процедуру, обновляя ее каждый час delta.

1 голос
/ 18 марта 2014

Если опция связи с базой данных недоступна, другой путь, который вы могли бы выбрать, - связать таблицы через ODBC с чем-то вроде отчетов MS Access или Crystal и выполнить объединение там.

1 голос
/ 28 февраля 2011

Объединение двух таблиц лучше всего выполняется СУБД, поэтому это следует делать таким образом. Вы можете отразить меньшую таблицу или ее подмножество в одной из баз данных, а затем присоединиться к ним. Кто-то может испытать желание сделать это на сервере ETL, таком как informatica, но я думаю, это не рекомендуется, если таблицы огромные.

0 голосов
/ 18 декабря 2018

Когда у меня были проблемы с соединением этих двух таблиц, мне удавалось делать именно то, что я хотел, открывая обе удаленные базы данных одновременно.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

У меня это сработало, надеюсь, это поможет ... Ура

0 голосов
/ 12 июня 2017

для этого просто следуйте приведенному ниже запросу

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

Там, где я написал имя базы данных, вы должны определить имя базы данных.Если вы находитесь в той же базе данных, поэтому вам не нужно определять имя базы данных, но если вы находитесь в другой базе данных, вы должны указать имя базы данных в качестве пути, иначе это покажет вам ошибку.Надеюсь, я облегчил вашу работу

0 голосов
/ 15 апреля 2017

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

Подход № 1. Использование синонимов для связи таблиц между базами данных на одном сервере.

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

0 голосов
/ 01 декабря 2016

Вы можете попробовать следующее:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...