Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在查询中使用distinct关键字的重复条目_Java_Sql - Fatal编程技术网

Java 在查询中使用distinct关键字的重复条目

Java 在查询中使用distinct关键字的重复条目,java,sql,Java,Sql,我正在使用java执行一些SQL查询。其中一些是从一个数据库(A)获取数据,并存储在另一个数据库(B)的表中。处理完成后,我将从数据库(B)的表中删除所有数据。我每5分钟重复一次这个过程。 代码: 它可以完美地运行10-20次,然后在Csn中给出“值”的重复输入错误,因为它是主键”。 我在查询中添加了Distinct关键字,在运行了10-20次之后,它仍然会给出这个错误 注意:我在进程开始之前从newtable中删除数据,所以它总是添加到空表中 指出我的错误所在。看起来您对distinct的工作

我正在使用java执行一些SQL查询。其中一些是从一个数据库(A)获取数据,并存储在另一个数据库(B)的表中。处理完成后,我将从数据库(B)的表中删除所有数据。我每5分钟重复一次这个过程。 代码:

它可以完美地运行10-20次,然后在Csn中给出“值”的重复输入错误,因为它是主键”。 我在查询中添加了Distinct关键字,在运行了10-20次之后,它仍然会给出这个错误

注意:我在进程开始之前从newtable中删除数据,所以它总是添加到空表中


指出我的错误所在。

看起来您对
distinct
的工作原理有误解。在具有多个选定列的查询中,它将搜索值的不同元组,而不是仅搜索不同的
Csn

有不同的方法可以仅通过一列选择不同的值。它通常取决于您使用的特定DBMS以及您想要应用于为相同
Csn
列值找到的乘法元组的逻辑。例如,考虑这个问题:


一般思路之一:仅为
Csn
列选择不同的单个值,然后遍历此列表并使用此
Csn
值选择值的第一个元组(我不知道是否适合选择第一个元组)。

插入数据时,如果不存在,您可以添加
不确保您的数据是唯一的(我认为PK中只有CSN列)


检查字段
ExtendInfo
的值是否不同。您尚未在
insert
中使用此字段。如果你不需要它。从
选择中删除该字段。我删除了不兼容的数据库标记。请用您真正使用的数据库进行标记。@viki888正在使用它,但我删除了该部分,因为我认为它与此问题无关。我应该把它放回去吗?DISTINCT删除重复的行,而不是重复的列。如果您想了解实际发生的情况,只需在您试图插入的内容上添加一些日志即可。@Gordon Linoff我已经添加了我正在使用的数据库。
         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();
if not exists(select 1 from tbl_alm_log_2000000000  where CSN=? ) 
  insert into newtable (CSN, IsCleared, Id, NEType, OccurTime, hostIP) values(?,?,?,?,?,?)