在java程序的for循环中,我正在执行这个查询。
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 当我检查我的源数据库时,只有1行a=23和b= ABC@XYZ.COM,所以源代码没有任何复制。
当我检查我的目标数据库时,我可以看到行a=23,b= ABC@XYZ.COM已经被插入到上一个循环迭代中。{我在程序开始时删除并重新创建目标表。}
因此,我的窗口查询似乎一次又一次地返回同一行。
我做了很多搜索,我很确定我的窗口查询不应该返回重复的.但看上去确实如此
我不是甲骨文专家.因此,让我知道上面的查询在运行不同的rownum范围时是否可以返回相同的行。
发布于 2016-08-24 16:30:36
使用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。
https://stackoverflow.com/questions/39128301
复制相似问题