0

我正在 java 程序的 for 循环中对 exadata 执行此查询

select a, b, c, d from (
        select rownum r, a, b, c, d from foo order by c asc
) where r >= 40001 and r < 50001

在这里,我不断将数字增加 10000,因此在下一次循环迭代中,数字将是 50001 和 60001

我将这些行插入另一个数据库并再次循环。

目前,我的代码遇到随机错误,如

Exception in thread "main" java.sql.BatchUpdateException: Duplicate entry '23-ABC@XYZ.COM' for key 'PRIMARY'
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1809)
    at 

当我检查我的源(exadata)数据库时,只有 1 行 a=23 和 b = ABC@XYZ.COM。所以来源没有任何重复。

当我检查我的目标数据库时,我可以看到行 a=23, b = ABC@XYZ.COM 已经插入到之前的循环迭代中。{{我在程序开始时删除并重新创建目标表。}}

所以看起来我的窗口查询一次又一次地返回同一行。

我做了很多搜索,我很确定我的窗口查询不应该返回重复项......但看起来确实如此

我不是 oracle/exadata 专家...所以让我知道上面的查询在使用不同的 rownum 范围运行时是否可以返回相同的行。

4

1 回答 1

1

使用row_number() over()这实际上是一个窗口函数。由于a并且b似乎使记录独一无二,您应该尝试一下。

select a, b, c, d 
  from (
        select row_number() over (order by a,b) as r, 
                a, b, c, d 
          from foo
        ) 
    where r >= 40001 
      and r < 50001;

PS:请记住,使用此方法在加载期间不应有任何 DML 的源表。PS2:rownum在这种情况下永远不会工作,因为在 order by 之前分配。更多信息

于 2016-08-24T16:30:36.110 回答