我正在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范围运行时可以返回相同的行,请告诉我。
答案 0 :(得分: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
在这种情况下永远不会起作用,因为在订单之前分配了。 More info