2017-12-02 18 views
1

があります。 私は初心者です。私は自分のSQLクエリの結果を入れ子にしたwhileループを実行したい。JDBC入れ子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 

私は

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 
、私は唯一の私のテーブルに一つだけのスタッフのための結果を得、以下のような

//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(); 
    } 

を私のJavaの文を書きました

私のコードに何が間違っているか本当に知りたい。

ありがとうございます。

答えて

2

最初に2番目のループが実行されると、myresults2の最後に到達します。一度それが起こるとmyresults2.next()は常にfalseを返すので、初めてのみ動作します。

ResultSetが転送のみの場合、カーソル位置を開始位置にリセットすることはできません。そのため、2回目のクエリは、すべてResultSetを消費するたびに再実行する必要があります。

ResultSetをスクロール可能(転送のみではなく)にして、クエリを再実行せずにカーソル位置をリセットできるようにするには、次の例を参照してください。https://stackoverflow.com/a/8033197/6245535

別の最適化は、「ENO」コードがif文と一致する場合(好ましくPreparedStatementを使用)の代わりに常にチェックする最初のループからの電流「ENO」とWHERE句を使用して濾過2番目のクエリを実行することであろう。

+0

ご意見ありがとうございます。 PreparedStatementを使用しようとしたときにうまくいきました。 –

関連する問題