2017-01-23 7 views
1

私はいくつかのSQLクエリを実行するためにjavaを使用しています。それらの中には、あるデータベース(A)からデータを取得し、別のデータベース(B)のテーブルに格納することがあります。プロセスが完了したら、データベース(B)のテーブルからすべてのデータを削除します。私はこのプロセスを5分ごとに繰り返す。 コード:クエリでdistinctキーワードを使用している重複エントリwhice

  String sql = "delete from newtable"; 
     stmt5 = conn.prepareStatement(sql); 
     stmt5.executeUpdate(sql); 
     String sql_1 = "select distinct tbl_alm_log_2000000000.Csn, tbl_alm_log_2000000000.IsCleared, tbl_alm_log_2000000000.Id,tbl_alm_log_2000000000.NEType, tbl_alm_log_2000000000.OccurTime, tbl_alm_log_2000000000.hostIP, tbl_alm_log_2000000000.ExtendInfo From fmdb.dbo.tbl_alm_log_2000000000 Where IsCleared = 0"; 

     ResultSet rs = stmt_1.executeQuery(sql_1); 



     String sql_2 = "insert into newtable (CSN, IsCleared, Id, NEType, OccurTime, hostIP) values(?,?,?,?,?,?)"; 


     conn.setAutoCommit(false); 
     PreparedStatement ps = conn.prepareStatement(sql_2); 

     final int batchSize = 1000; 
     int count = 0; 

     while (rs.next()){     
       ps.setString(1, rs.getString(1)); //csn 
       ps.setString(2, rs.getString(2)); //iscleared 
       ps.setString(3, rs.getString(3));//id 
       ps.setString(4, rs.getString(4));//netype 
       ps.setString(5, rs.getString(5));//occurtime 
       ps.setString(6, rs.getString(6));//hostip 


      ps.addBatch(); 

      if(++count % batchSize == 0) { 
       ps.executeBatch(); 
      } 
     } 
     ps.executeBatch(); // insert remaining records 
     conn.commit(); 
     ps.close(); 

それは10の-20の実行のために完璧に実行され、その後、「それが主キーであるようCsnの中に 『値』のための重複入力エラー」を与えます。 クエリでDistinctキーワードを追加しましたが、10〜20回実行してもこのエラーが発生します。

注:新しいテーブルからデータを削除すると、プロセスが開始されるため、常に空のテーブルに追加されます。

私はどこが間違っているのかを提案します。

+0

チェック。このフィールドは 'insert'で使われていません。あなたがそれを必要としない場合。そのフィールドを 'select'から削除します。 – Viki888

+0

互換性のないデータベースタグを削除しました。実際に使用しているデータベースにタグを付けてください。 –

+0

@ viki888それは使用されていますが、私はそれがこの問題に関係しないと思ったので、私はその部分を削除しました。私はそれを戻すべきか? –

答えて

1

distinctの仕組みについて誤解しているようです。いくつかの選択された列を含むクエリでは、異なるCsn列のみではなく、異なる値のタプルを検索します。

異なる値を1つの列でのみ選択する方法はいくつかあります。一般的には、使用する特定のDBMSと、同じCsnカラム値で見つかった乗算タプルに適用するロジックに依存します。一般的なアイデアのDISTINCT for only one Column

ワン::例えば、この質問を考えるだけで、その後、このリストを反復処理し、このCsn値を持つ値の最初のタプルを選択Csn列に対して個別の単一の値を選択します(私は知らないことが適しています最初のタプルを選択するかどうかを選択します)。

0

あなたはデータを挿入するとき、あなたはあなたのデータが一意であることを確認してくださいif not existsではなく追加することができます(私はPKでCSN列のみを考えられる)は、フィールド `ExtendInfo`に異なる値を持っているかどうかを

if not exists(select 1 from tbl_alm_log_2000000000 where CSN=?) 
    insert into newtable (CSN, IsCleared, Id, NEType, OccurTime, hostIP) values(?,?,?,?,?,?) 
関連する問題