2

異なるデータベースの2つのテーブルを一度に呼び出したいデータベースAのテーブルにはユーザーIDが含まれ、データベースBのテーブルにはユーザーIDを持つユーザーの場所が含まれているため、これら2つのテーブルを結合して、user_id.databaseAに対応する場所を取得しますおよびBは2つの異なるサーバーにあります。では、どうすればこれら2つのテーブルを結合できますか。これに参加できない場合、これを行うための効率的な方法はありますか。助けてください。私はjava、mysqlを使用してこれを行おうとしています。

 ps = con.prepareStatement("SELECT user_id FROM A.users");
 rs = ps.executeQuery();
 while(rs.next())
    {
    //call select statement for database B to get the location for each user id             

    }

これを行うための効率的な方法を提案してください

Id  User_id
===========
1   44
2   23

User_id     location
====================
44          india
23          us
4

3 に答える 3

2

FEDERATEDStorageEngineを使用できます。FEDERATEDストレージエンジンを使用すると、レプリケーションやクラスターテクノロジーを使用せずに、リモートのMySQLデータベースからデータにアクセスできます。ローカルのFEDERATEDテーブルをクエリすると、リモート(フェデレーション)テーブルからデータが自動的にプルされます。ローカルテーブルにはデータは保存されません。これはあまり効率的ではないかもしれませんが、それは仕事をします(JOIN)。

于 2012-12-24T09:53:04.150 に答える
2

と仮定user_idlongます。

PreparedStatement psUserLocation = conB.prepareStatement("SELECT location FROM B.users WHERE user_id = ?");
while(rs.next()) {
    //call select statement for database B to get the location for each user id
    long userId = rs.getLong(user_id);
    psUserLocation.setLong(1, userId)
    ResultSet userLocation = ps.executeQuery();
    // Do whatever with the location(s)
}

編集:ユーザーごとに1つのクエリではなく、すべてのユーザーに対して1つのクエリ:

private final static String QUERY = "SELECT user_id, location FROM B.users WHERE user_id IN (%a)";

StringBuilder userList = new StringBuilder();
while(rs.next()) {
    long userId = rs.getLong(user_id);
    userList.append(userId);
    if (!rs.isLast()) {
        userList.append(",");
    }
}

String usersLocationQuery = QUERY.replaceAll("%a", userList.toString());
PreparedStatement psUsersLocation = conB.prepareStatement(usersLocationQuery);
ResultSet usersLocation = psUsersLocation.executeQuery();
// Do whatever with the locations

INほとんどのDBには、SQL句に含めることができる項目の数に制限があるため、これは失敗したり、正しく機能しなかったりする可能性があることに注意してください。%aまた、この2番目の方法では、置換時にSQLインジェクションが可能になる場合があります。

于 2012-12-24T10:05:53.307 に答える
1

結合を廃止できる場合、考えられる1つの方法は、tableAからすべてのuser_idを一度に取得してから、user_idを一度にtableBに渡すことです。もちろん、このアプローチではコードも変更する必要があります。

何かのようなもの:

select user_id from tableA (of databaseA);

select user_id, location from tableB (of database B) where user_id in (<result_from_above_query)

上記のプロセスでは、2つのクエリが必要になります。

于 2012-12-24T10:23:11.717 に答える