如何从java中的oracle查询加入两个ResultSet

时间:2012-09-19 18:39:35

标签: java oracle java-ee

是否可以加入两个ResultSet,例如在Java-oracle编程中连接两个表?我正在编写一个java程序,它可以查询两个不同的oracle数据库(数据库实际上位于不同的位置)。在程序中,sql1返回ResultSet ret1; sql2返回ResultSet ret2。假设ret1具有以下数据:

Id   item
------------
1   item1
2   item 2
3   item 3
.........

Ret2具有以下数据

Id  info
---------
1  info1
2  info2
…

我需要这样的结果

Id item info
----------------------
1   item1 info1
2   item2  info2

我可以在java中执行类似的操作:

Select ret1.id,ret1.item,ret2,info from ret1, ret2 where ret1.id=ret2.id

我知道我可以从ret1循环并获取id然后从ret2获取信息;我想知道是否有一种快速方式,如加入两个表来连接两个ResultSet而不循环?实际上这两个结果都有50万行。谢谢!

5 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情:

 SELECT ret1.id,ret1.item,ret2.info
FROM ret1
RIGHT JOIN ret2 
ON ret1.id=ret2.id;

Sql Fiddle example

修改

如果两个ResultSet来自同一个数据库,那么为什么不在检索过程中使用union来组合它们; e.g。

select A, B
from C
union
select A, B
from D

答案 1 :(得分:0)

您可以做的最好的事情是遍历Java中的结果集ret1ret2,并比较它们中的id,然后将结果存储在多维数组中,像 -

  while (ret1.next()) {
        int id1 = rs.getInt("ID"); 
        while (ret2.next()){
               int id2 = rs.getInt("ID");
               if ( id1 == id2 )
               ...  
               ...
        }
  }

正如其他人所说,更好的方法是使用dblinks。正如Tom Kyte所说 -

  

您编写的代码越少,您创建的错误就越少   您编写的代码越多,您创建的错误就越多   编写更少的代码,减少错误   写更多代码,遭受更多错误

答案 2 :(得分:0)

最干净,最有效的解决方案是从一个数据库到另一个数据库的dblink,并在查询中进行连接。否则你必须遍历两个结果集。

答案 3 :(得分:0)

您的输出是针对某种类型的bean还是其他Java数据结构?
假设它是,你使用commons dbutils来填充javabean。
我将使用BeanListHandler创建ret1类型的bean列表,然后在ret2上使用BeanMapHandler来获取bean的映射,其中map键是来自ret2的id。
然后,当您循环访问ret1时,可以通过ret1的id访问ret2中的值。
希望有道理。

答案 4 :(得分:0)

由于权限问题,不允许创建dblink。我终于找到另一个解决方案这是我正在做的事情:我得到结果集ret1然后使用:

while (ret1.next()) { 
  get id from ret1, 
  query  info from another database;
  bla,bla,...
}
....

性能比获得两个结果集然后在另一个结果集中循环更好......