如何比较两个不同数据库的结果集?

时间:2014-02-14 07:06:15

标签: java jdbc

我有两个数据库,如果它们匹配,我需要比较每个数据库中的三行,我必须打印该行。

示例:

Database 1:
RuleId  Dataset  Partition  Date
------  -------  --------   ----
1234     ABVD    012145    21/01/2014
1256     ABCD    124565    22/01/2013
4567     FGHJ    0123456  22/02/2013
Database 2:
1234    ABCD    012345    21/01/2014
4567    FGHJ    0123456   22/02/2013
7894    MNBV    0147896   20/01/2014

如果两个数据库中的RuleId,Dataset和Partition相同,我必须在输出中打印这些行。

我的代码如下:

ArrayList<String> rslist = new ArrayList<String>();
ArrayList<String> rs1list = new ArrayList<String>();
int count = 1;
while (rs.next()) {
    int i = 1;
    count = 1;
    while (i < count) {
        rslist.add(rs.getString(i++));
    }

    rslist.add(rs.getString(2) + rs.getString(4) + (rs.getString(5)));

}
int count1 = 1;
while (rs1.next()) {
    int i = 1;
    count1 = 1;
    while (i < count1) {
        rs1list.add(rs1.getString(i++));

    }
    rs1list.add(rs1.getString("RuleId") + rs1.getString("Dataset")
            + rs1.getString("Partition"));
}
for (String s1 : rslist)
    for (String s2 : rs1list)
        if (s1.equals(s2)) {

        }

如果这些行相等,我必须打印所有行值。

4 个答案:

答案 0 :(得分:1)

executeQuery()方法中,您可以使用以下SQL命令:

select * from db1,db2 where db1.ruleid=db2.ruleid and db1.dataset=db2.dataset and db1.partition=db2.partition;

然后,您可以获得两个数据库中显示的匹配行。

答案 1 :(得分:0)

用于比较而无需在内存中预加载的示例(从头开始):

    Connection con1 = DriverManager.getConnection("jdbc:mysql://localhost/db1", "user", "pass");
    Connection con2 = DriverManager.getConnection("jdbc:mysql://localhost/db2", "user", "pass");

    Statement stmt1 = con1.createStatement();
    Statement stmt2 = con2.createStatement();

    ResultSet rs1 = stmt1.executeQuery("select * from ... order by ... ");
    ResultSet rs2 = stmt2.executeQuery("select * from ... order by ... ");

    while(rs1.next() && rs2.next()) {
        // compare basically rs1.getObject(i).equals(rs2.getObject(i))
    }

或者从db1读取然后从db2检索来自PK的PK。我不知道你的用例...

答案 2 :(得分:0)

ResultSet最终是Object的子类,我们可以直接比较两个或多个对象。 您的问题有点具体:

ResultSet rs=st.executeQuery(sql1);
ResultSet rs1=st.executeQuery(sql2);

其中sql1和sql2是2个语句

while(rs.next() && rs1.next()){
         int a=rs.next();
         int b=rs1.next();
         if(a==b){
              System.out.println("Compairing two ResultSets");
         }
     }

答案 3 :(得分:0)

如果数据量不大,我建议完全加载数据集并在内存中进行比较,如下所示。

定义类以表示实现equals的记录,该记录提供逐元素地比较字段的逻辑

public class Record {
    ...
    public boolean equals(Object record) {
        ...

将两个数据集分别加载到Set(而不是ArrayList,尽管后者也可以正常工作,如果需要,可以使用LinkedHashSet并使用set操作来检查存在于两者中的元素,或者如果一个元素是另一个元素的子集等。

其他建议的方法假设形式非常好的集合具有不同的顺序,没有重复,没有中间插入(A,C对A,B,C)等。