首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle/ExaData返回重复行

Oracle/ExaData返回重复行
EN

Stack Overflow用户
提问于 2016-08-24 16:12:26
回答 1查看 490关注 0票数 0

在java程序的for循环中,我正在执行这个查询。

代码语言:javascript
复制
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。

我将这些行插入到另一个数据库中,然后再次循环。

目前,我的代码遇到了一些随机错误,例如

代码语言:javascript
复制
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范围时是否可以返回相同的行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-24 16:30:36

使用row_number() over(),它实际上是一个窗口函数。由于ab似乎使记录变得独一无二,所以您应该尝试。

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39128301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档