異なるサーバー上の2つのデータベースの2つのテーブルを結合してデータをクエリする


102

異なるサーバー上の2つの異なるデータベースに2つのテーブルがあるため、クエリを少なくするためにそれらを結合する必要があります。どのようなオプションがありますか?私は何をすべきか?


PRAMPがあなたをここに連れてきたように
Janac Meena

回答:


85

を使用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を使用しますが、クエリを使用して一部のデータを除外すると、2番目のオプションを使用すると時間とパフォーマンスを節約できます。


1
php-mysqlでそれは可能ですか..はいの場合、そのオプションでどのように成長できるかを教えていただけますか?
Jhanvi 2012

1
MySQLがリンクサーバーをサポートしているかどうかはわかりません。この回答はMicrosoft SQLサーバーに固有です。
スコットアンダーソン、

3
誰かがPostgreSQLの答えを探しているなら、これを試してください:postgresql.org/docs/9.4/static/postgres-fdw.html
PJSCopeland '19年

7

これを試して:

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

リンクサーバーがdbaで許可されていない場合は、OPENROWSETを使用できます。Books Onlineは、必要な構文を提供します。


4

実用的な企業の観点から、ベストプラクティスは、データベース内のデータベーステーブルのミラーコピーを作成し、タスク/プロシージャにデルタの時間ごとにそれを更新させることです。


1

2つのテーブルの結合はDBMSで行うのが最適なので、そのように行う必要があります。小さいテーブルまたはそのサブセットをデータベースの1つにミラーリングしてから、それらを結合できます。informaticaのような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

私がdatabasenameを書いたところ、データベースの名前を定義する必要があります。同じデータベースにいる場合はデータベース名を定義する必要はありませんが、他のデータベースにいる場合はパスとしてデータベース名を指定する必要があります。そうしないとエラーが表示されます。私はあなたの仕事を簡単にしたと思います


-2

これらの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>";
}

画面にこれらの2つのOKが表示された場合、両方のデータベースが開いていて準備ができています。その後、クエリを実行できます。

$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();

いくつかの結合を実行しようとしましたが、これらの2つのDBを開いているので、接続を変更する$mysqli1か、または$mysqli2

それは私のために働いた、それが役に立てば幸い...乾杯


私は誰もphpを使わないと言ったとは思いません...同じ問題があり、いくつかのプログラミングでそれを解決することができました
Luis H Cabrejo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.