java - JDBC 嵌套 while 循环

标签 java sql database jdbc iteration

那里。 我是使用 java 的初学者。我想为我的 SQL 查询结果做一个嵌套的 while 循环。

我原来的结果如下,

eno ename   title   date_visit  ssn         pname       charge    
103 Jekyl   Doctor  20170717    946883650   Gershwin    125
106 Ratchet Nurse   20170817    946883650   Gershwin    125
103 Jekyl   Doctor  20170917    946883650   Gershwin    182
104 Caligari    Doctor  20170707    831287780   Schubert    182
106 Ratchet Nurse   20170930    799023031   Haydn   190
102 Welby   Doctor  20170818    416806352   Bernstein   210
102 Welby   Doctor  20170808    874136439   Brahms  245
104 Caligari    Doctor  20170808    796235486   Wagner  245
102 Welby   Doctor  20170929    445139565   Chopin  405
102 Welby   Doctor  20170910    874136439   Brahms  512
103 Jekyl   Doctor  20170910    524246868   Verdi   512
103 Jekyl   Doctor  20170909    129141378   Vivaldi 667
103 Jekyl   Doctor  20170909    524246868   Verdi   667

我写了如下我的 java 语句,

   //Now we execute our query and store the results in the myresults object:       
   ResultSet myresults1 = stmt1.executeQuery("SELECT DISTINCT eno, ename, title FROM Staff_Activity");
   ResultSet myresults2 = stmt2.executeQuery("SELECT eno, ename, title, date_visit, ssn, pname, SUM(charge) AS total_charge FROM Staff_Activity GROUP BY eno, ename, title, date_visit, ssn, pname");

   System.out.println("Employee_ID\tEmployee_Name\tTitle");
   System.out.println("-----------\t-------------\t------"); //Print a header

   while (myresults1.next()) { //pass to the next row and loop until the last         
      System.out.println(myresults1.getInt("eno") + "\t\t" +  myresults1.getString("ename") + "\t\t" +  myresults1.getString("title"));

      while (myresults2.next()) {
          if (myresults1.getInt("eno")==(myresults2.getInt("eno"))) {
              System.out.println(myresults2.getInt("date_visit") + "\t\t" +  myresults2.getInt("ssn") + "\t\t" +  myresults2.getString("pname") + "\t\t" +  myresults2.getInt("total_charge"));
          }//Print the current row
        }
        System.out.println();
    }

我只得到了表中一名员工的结果,

Employee_ID     Employee_Name   Title
-----------     -------------   ------
103             Jekyl           Doctor
20170909                524246868               Verdi           667
20170909                129141378               Vivaldi         667
20170910                524246868               Verdi           512
20170717                946883650               Gershwin                125
20170917                946883650               Gershwin                182

106             Ratchet         Nurse

102             Welby           Doctor

104             Caligari                Doctor

真的很想知道我的代码出了什么问题。

提前致谢。

最佳答案

第一次执行第二个循环,会走到myresults2的结尾;一旦发生这种情况,myresults2.next() 将始终返回 false,因此它只会在第一次运行。

如果 ResultSet 是 forward only 则不能将光标位置重置为开头,因此每次完全使用其 ResultSet 时都必须重新执行第二个查询

要使 ResultSet 可滚动(不只是向前滚动)并因此能够在不重新执行查询的情况下重置其光标位置,请参见以下示例:https://stackoverflow.com/a/8033197/6245535 .

另一个优化是使用 WHERE 子句和来自第一个循环的当前“eno”过滤执行第二个查询(最好使用 PreparedStatement)而不是总是检查“eno”代码是否与 if 语句匹配。

关于java - JDBC 嵌套 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47613153/

相关文章:

sql - 选择类别相同但整数相反的记录

mysql - 获取 "Multiple"列中每个不同值的计数

MySQL join 即使应该返回结果也不返回结果

java - Avro 寻找 SnappyCodec 抛出 NoClassDefFoundError

java - 使用 Selenium ChromeDriver 设置 Chrome 的语言

java - 即使 Appnext SDK 不在 AndroidManifest.xml 中,它如何为其广告启动自己的 Activity ?

php - 来自多个 MySQL 表的单个 HTML 表

database - Postgres 是否有类似于 Oracle 的虚拟专用数据库的东西?

mysql - 为可以具有多个可选列和依赖项的表设计数据库

java - 如何在 IntelliJ 中显示连接左大括号和右大括号的线?