проблема зацикливания при добавлении данных в существующий текстовый файл - PullRequest
0 голосов
/ 08 апреля 2010
     try {
     stmt = conn.createStatement();
     stmt1 = conn.createStatement();
     stmt2 = conn.createStatement();
     rs = stmt.executeQuery("select cust from trip1");
     rs1 = stmt1.executeQuery("select cust from trip2");
     rs2 = stmt2.executeQuery("select cust from trip3");
      File f = new File(strFileGenLoc);
      OutputStream os = (OutputStream)new FileOutputStream(f,true);
      String encoding = "UTF8";
      OutputStreamWriter osw = new OutputStreamWriter(os, encoding);
      BufferedWriter bw = new BufferedWriter(osw);


 }


       while ( rs.next() ) {

         while(rs1.next()){

              while(rs2.next()){

         bw.write(rs.getString(1)==null? "":rs.getString(1));
             bw.write("\t");
         bw.write(rs1.getString(1)==null? "":rs1.getString(1));
         bw.write("\t");
         bw.write(rs2.getString(1)==null? "":rs2.getString(1));
         bw.write("\t");

         bw.newLine();

              }
         }
     }

Над кодом работает нормально.Моя проблема: 1. Набор результатов «rs» содержит одну запись в таблице 2. Набор результатов «rs1» содержит 5 записей в таблице 3. Набор результатов «rs2» содержит 5 записей в таблице

Данные «rs»получая рекурсивный.

при записи в тот же текстовый файл, вывод я получаю как

1   2    3
1   12   21
1   23   25
1   10   5
1   8    54

, но мне нужен вывод, как показано ниже

1   2    3
   12   21
   23   25
   10   5
    8    54

Какие вещи янужно изменить в моем коде .. Пожалуйста, совет

Ответы [ 3 ]

0 голосов
/ 08 апреля 2010

Вы должны объединить три таблицы, используя общий столбец (часто называемый внешним ключом). Значения в таблицах trip2 и trip3 говорят, к какой записи они принадлежат в таблице trip1. Тогда вы можете сделать это:

select t1.cust, t2.cust, t3.cust
from trip1 t1 
  join trip2 t2 on t1.id = t2.trip1_id
  join trip3 t3 on t1.id = t3.trip1_id
order by t1.id

Теперь вы получите все результаты в одном наборе результатов. Чтобы получить нужный вывод, напечатайте первый столбец (rs.getString(1)) только при его изменении.

0 голосов
/ 08 апреля 2010

Логика здесь ошибочна.Если вы получите только один результат в rs2, вы увидите только одну строку, так как ваш while(rs2.next()) будет ложным после того, как вы пройдете его один раз.Одним из вариантов было бы перебрать все ваши результирующие наборы, поместить значения в массивы, а затем перебрать их, чтобы поместить строки в ваш файл.По мнению @Aaron Digulla, лучшим решением было бы вернуть только одну ResultSet из вашей базы данных.

0 голосов
/ 08 апреля 2010

Помогает ли это?

while ( rs.next() ) {

     bw.write(rs.getString(1)==null? "":rs.getString(1));

     while(rs1.next()){

          while(rs2.next()){        
              bw.write("\t");
              bw.write(rs1.getString(1)==null? "":rs1.getString(1));
              bw.write("\t");
              bw.write(rs2.getString(1)==null? "":rs2.getString(1));
              bw.write("\t");

              bw.newLine();

          }
      }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...