4

実際にはどちらのデータベースも変更したくありません。データを取得するだけです。

これらの接続文字列を使用して、各データベースに個別に接続する方法を知っています。

Provider=SQLOLEDB.1;Data Source={0};Initial Catalog={1};Integrated Security=SSPI;Persist Security Info=False;

Provider=OraOLEDB.Oracle.1;Data Source={0};User ID={1};Password={2};Persist Security Info=True;

しかし、どうすればこの重複するデータをまとめることができますか?特に、1つがOracleで、もう1つがSQL Serverであることを考えると、それも可能ですか?または、各データベースでSELECTステートメントを個別に実行し、後でそれらを照合する方がよいでしょうか。


たとえば、10歳で、青色が好きなすべての生徒を取得するにはどうすればよいですか。 2つのテーブル

DatabaseBのすべてのアイテムにはDatabaseAにマップするIDがありますが、その逆ではないことに注意してください。

4

9 に答える 9

9

私はこれをMySQL、Oracle、SQLサーバーで行いました。中央のMSSQLサーバーからOracleおよびその他のMSSQLサーバーへのリンクサーバーを作成できます。次に、リンクサーバーを使用してオブジェクトを直接クエリするか、データベース内のリンクサーバーテーブルの同義語を作成できます。

リンクサーバーの作成と使用に関する手順は次のとおりです。

  1. 「メイン」MSSQLサーバーで、2つのデータベースを含むサーバーに2つのリンクサーバーを作成するか、データベースAとデータベースBを作成します。
  2. 次に、プレーンなTSQL selectステートメントを使用して、リンクサーバー上のテーブルを直接クエリできます。

Oracleへのリンクサーバーを作成するには、次のリンクを参照してください:http ://support.microsoft.com/kb/280106

同義語についてもう少し。多くのクエリでこれらのリンクされたサーバーテーブルを使用する場合は、コードを維持するために同義語を使用する価値があるかもしれません。同義語を使用すると、別の名前で何かを参照できます。

したがって、たとえば、リンクサーバーからデータを選択する場合は、通常、次の構文を使用してデータを取得します。

SELECT *
FROM Linkedserver.database.schema.table

Linkedserver.database.schema.tableの同義語をDBTable1として作成した場合、構文は次のようになります。

SELECT *
FROM DBTable1

これにより、入力が少し節約されます。さらに、リンクサーバーが変更された場合でも、コード全体で変更を行う必要はありません。私が言ったように、多くのコードでリンクサーバーを使用する場合、これは本当に有益です。

さらに注意すべき点として、異なるサーバー上の2つのテーブル間で結合を行うことができます。ただし、これは通常、痛々しいほど遅いです。別のサーバーから一時テーブルにデータを選択でき、一時テーブルを結合すると、通常、処理速度が向上することがわかりました。マイレージは異なる場合がありますが、異なるサーバー上のテーブルを結合する場合は、この手法が役立ちます。

詳細が必要な場合はお知らせください。

于 2013-01-23T10:18:48.780 に答える
2

どのデータベースを使用していますか?ほとんどのデータベースには、dblinksと呼ばれる概念があります。データベースAにデータベースBのdblinkを作成する必要があります。次に、同義語を作成して(必須ではありませんが、簡単にするため)、データベースAのテーブルであるかのように使用できます。

于 2013-01-15T19:17:46.790 に答える
1

異種結合のように見えます(異なるサーバー/テクノロジーなどのデータ)。

そのため、簡単ではありません。ナンフィビアンの方法を機能させることができるなら、そのようにしてください。

それ以外の場合は、両方のテーブルから共通の場所(「稼働中」のサーバーのいずれか、またはデータを同じ場所に配置するためだけの3番目のサーバー/テクノロジー)にデータを収集する必要があります。そうすれば、楽しくデータに参加できます。多くのETLツールはこのように機能し、この状況では(ほとんど)、結合する前に1つ以上のテーブルを共通の場所に再配布する必要があります。Oracle Data Integrator ETLツールがこれを実行し、TalendOpenStudioのtJoinコンポーネントも実行します。

HTH

于 2013-01-25T19:51:26.403 に答える
0
SELECT (things)
FROM databaseA.dbo.table t1
INNER JOIN databaseB.dbo.table t2 ON t1.Col1 = t2.Col2
WHERE t1.Col1 = 'something'

編集-このステートメントは、新しい要件を満たす必要があります。

SELECT *
FROM databaseA.dbo.table t1
INNER JOIN databaseB.dbo.table t2 ON t1.ID = t2.ID
WHERE t1.Age = 10 AND t2.FavoriteColor = 'Blue'
于 2013-01-15T19:17:49.193 に答える
0

データベースが同じサーバー上にあると仮定すると、次のようなことができるはずです。

SELECT t.field1, t.field2
FROM database.schema.table t
JOIN database2.scheme.table2 t2 
   on t.id = t2.id
WHERE t2.field3 = ...

データベースが別々のサーバー上にある場合は、の使用を検討してLinked Serversください。

于 2013-01-15T19:19:13.370 に答える
0

VisualStudioで3つのLinqクエリを作成してみてください。1つはSQLServer用、もう1つはOracle用、もう1つは2つのデータベースオブジェクトを結合するためのものです。

于 2013-01-15T19:33:31.220 に答える
0

2つの異なるサーバーとデータベースからデータを選択する場合は、一方のデータがリンゴのようで、もう一方のデータがオレンジのようである可能性があるため、結合ではなく結合を実行します。リンクされたサーバーをセットアップする必要があります。示されている特定のバージョンの後で、OracleとSQL Serverをリンクできると思いますが、次のようなことができます。

select ColA, ColB, ColC
from (ServerASQLServer).(DatabaseA).(schema).(table)
UNION
select ColA, ColB, ColC
from (ServerBOracleServer).(DatabaseB).(schema).(table)

内部結合を実行する場合、データはバインドするデータ型を共有する必要があります。そうしないと、返されるデータセットからデータ型が省略されます。ユニオンは列のデータ型を共有する必要がありますが、ロジックは関係ありません。本質的には、「列のロジックの一致に基づいて、これら2つの異なる行のセットをまとめます」と言っています。

しかし、あなたは接続文字列について言及していたので、.NETのようなタイプのコードメソッドでそれを実行したいのかどうか興味がありましたか?私はそのためのアイデアを提供することもできます。

于 2013-01-22T21:27:14.747 に答える
0

これらの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が表示されたら、両方のデータベースが開いて準備ができています。次に、クエリの実行に進むことができます。

あなたの特定の質問について、私は最初にデータベースAからすべての10歳の子供を選択し、次にデータベースBからのIDによってそれらを色に一致させるようなことをします。それはうまくいくはずです、私は私のサーバーでこのコードをテストしていませんが、以下の私のサンプルこのコードは機能します。色、年齢など、何でもカスタムクエリを実行でき、必要に応じてグループ化することもできます。

$results = $mysqli1->query("SELECT * FROM DatabaseTableA where age=10");
    while($row = $results->fetch_array()) {
        $theColorID = $row[0];
        $theName = $row[1];
        $theAge = $row[2];
        echo "Kid Color ID : ".$theColorID." ".$theName." ".$theAge."<br>";
        $doSelectColor = $mysqli2->query("SELECT * FROM DatabaseTableB where favorite_color=".$theColorID." "); 
        while($row = $doSelectColor->fetch_assoc()) {
            echo "Kid Favorite Color : ".$row["favorite_color"]."<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();

私はいくつかの結合を行おうとしていましたが、これら2つのDBを開いたので、接続を変更するだけでクエリを行ったり来たりすることができます$mysqli1$mysqli2

それは私のために働いた、私はそれが役立つことを願っています...乾杯

于 2018-12-19T17:28:48.090 に答える
-1

両方のデータベースが同じサーバーにある限り、データベース名を持つテーブルを参照できます:)

SELECT * FROM db1.table1
join 
db2.tbable2 
WHERE db1.table1.col1 = db2.table2.col1;
于 2013-01-15T19:21:35.607 に答える