JDBC嵌套while循环

时间:2017-12-02 22:12:40

标签: 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

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

第一次执行第二个循环时,它将到达myresults2的末尾;一旦发生这种情况,myresults2.next()将始终返回false,因此它将仅在第一次起作用。

如果ResultSet只是转发,则无法将光标位置重置为开头,因此每次完全使用其ResultSet时,您都必须重新执行第二个查询。 / p>

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

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