2017-12-02 12 views
1

이 있습니다. 나는 자바를 사용하는 초보자입니다. 내 SQL 쿼리 결과에 중첩 된 while 루프를 수행하려고합니다.JDBC 중첩 루프

내 원래 결과는

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 

는 나는 단지 내 테이블에 단 하나 명의 직원에 대한 결과를 얻었다

//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 

정말 내 코드에 문제가 있는지 알고 싶습니다.

미리 감사드립니다.

답변

2

두 번째 루프가 처음 실행되면 myresults2 끝까지 도달하게됩니다. 일단 myresults2.next()이 발생하면 항상 false가 반환되므로 처음에만 작동합니다.

ResultSet이 앞으로 만있는 경우 커서 위치를 처음으로 재설정 할 수 없으므로 ResultSet을 모두 소비 할 때마다 두 번째 쿼리를 다시 실행해야합니다.

ResultSet을 스크롤 할 수있게하고 (전달이 아님) 쿼리를 다시 실행하지 않고 커서 위치를 재설정하려면 다음 예제를 참조하십시오. https://stackoverflow.com/a/8033197/6245535.

또 다른 최적화는 "ENO"코드가 if 문으로 일치하는 경우 (바람직하게는 PreparedStatement 사용) 대신 항상 확인하는 첫 번째 루프에서 현재 "ENO"와 WHERE 절을 사용하여 필터링 두 번째 쿼리를 실행하는 것입니다.

+0

의견을 보내 주셔서 감사합니다. PreparedStatement를 사용하려고 할 때 잘 작동했습니다. –