我有以下结构:
列表-->列表_参与者-->参与者
所以一个列表可能包含多个参与者。我试着用java读这个:
stat = con.createStatement();
ResultSet rs = stat.executeQuery("select * from list;");
// get the informations about the bracket sheet
while (rs.next()) {
string name = rs.getString("Name");
ResultSet rs2 = stat.executeQuery("select * from List_Participant where name= '"+name+"';");
while (rs2.next()) {
// get the participants
}
rs2.close();
}
rs.close();
但这不起作用。我没有收到异常或任何其他输出。我建议打开第二个结果集将关闭第一个结果集,因为我做了第一个结果集,将数据存储在数组列表中并关闭它,然后第二个结果集就可以工作了,但这会导致性能不佳,因为我必须总是在数组列表中搜索。
什么可能是更好的解决方案?
编辑:解决方案是做一个加入,我目前的尝试:
select * from List_participant
INNER JOIN List ON List.name = List_participant.List
INNER JOIN participant ON List_participant.participant =participant.ROWID;
既然列可能具有相同的名称,那么现在如何对列进行寻址?
3条答案
按热度按时间pgvzfuti1#
您可以尝试为每个查询使用 * 两个 * 不同的
Statement
示例。参见java.sql.Statement的JavaDoc。下面的例子说明了这个原理。**但是:**这不是JDBC或SQL的标准用法。它剥夺了数据库的任何优化可能性,并在DB和应用程序之间移动了大量数据(参见JohnSkeet和BalusC的评论)。
最好在您的唯一语句中使用适当的
JOIN
。这 * 可以 * 由DB优化:添加您喜欢的任何过滤器/条件,以最小化检索的数据。
svujldwt2#
以下是不能从同一个
Statement
打开两个ResultSet
的原因ResultSet
javadoc:当生成ResultSet对象的Statement对象被关闭、重新执行或用于从多个结果的序列中检索下一个结果时,ResultSet对象将自动关闭。
所以基本上,一个
Statement
一次只能给予你一个ResultSet
,所以当你执行第二个查询时,你会丢失第一个结果。解决方案:
ResultSet
需要使用一个Statement
示例。fnvucqvd3#
嵌套查询?类似于
Select * from List_Participant where name in (select name from List);
的东西也可以用于第三个表。