Oracle / ExaData RowNum Range返回重复的行

时间:2016-08-24 16:12:27

标签: oracle exadata

我正在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)数据库时,只有一行a = 23且b = ABC@XYZ.COM。所以来源没有任何重复。

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

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

我做了很多搜索,我很确定我的窗口查询不应该返回重复...但它似乎确实

我不是oracle / exadata专家...所以,如果有更改,上面的查询在使用不同的rownum范围运行时可以返回相同的行,请告诉我。

1 个答案:

答案 0 :(得分:1)

使用row_number() over()实际上是一个窗口函数。 由于ab似乎使记录与众不同,因此您应该尝试。

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在这种情况下永远不会起作用,因为在订单之前分配了。 More info