Oracle中怎么利用row_number()over()方式解决插入数据时重复键

本篇文章为大家展示了Oracle中怎么利用row_number()over()方式解决插入数据时重复键,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。


导入目的表

Oracle中怎么利用row_number()over()方式解决插入数据时重复键

Oracle中怎么利用row_number()over()方式解决插入数据时重复键

上图中可以看到,我们的目的表中的主键有三个orgcode,saleno和serialno

源表

源表还是我们SQL数据库里的表

Oracle中怎么利用row_number()over()方式解决插入数据时重复键

从两个数据表中可以看到部分列需要我们自己对应的,而源表中并没有serialno这一项,通过表分析我们可以看出,如果说源表的数据中同一个SaleNo中如果有两个ZfCode,我们如果把Serialno设置为一个默认值 ,肯定会变为插入重复键了。

我们执行一下默认的插入语句,系统直接弹出重复键的问题

Oracle中怎么利用row_number()over()方式解决插入数据时重复键

Oracle中怎么利用row_number()over()方式解决插入数据时重复键

我们看了一下数据中SaleNo的2019040100015486中有两条数据,按我们要导入的表的主键orgcode,Saleno,Serialno,这样插入肯定是重复键了

Oracle中怎么利用row_number()over()方式解决插入数据时重复键

解决上面这个问题我们就用到了row_number()over()的函数

通过我们把Saleno进行分组排序,修改一下查询的数据

Oracle中怎么利用row_number()over()方式解决插入数据时重复键

Oracle中怎么利用row_number()over()方式解决插入数据时重复键

可以看到同一SaleNo下的两条数据自动排序了。

完整的插入代码

insert into tSalSalePay201904(Orgcode,Saleno,Trantype,Serialno,Zfcode,Zfname,      Zfno,Paysstotal,Zftotal,Sstotal,Jzdate)      select '0' as orgcode,"SaleNo","TranType",      row_number() over(partition by "SaleNo" order by "SaleNo") as Serialno,      "ZfCode","ZfName","ZfNo","ZfTotal","ZfTotal","ZfTotal","JzDate"      from tJkSalePay201904@Odbc_Sql src where not exists(select * from tSalSalePay201904 dst      where dst.Orgcode='0' and dst.Saleno=src."SaleNo")

基本上row_number() over()这个函数主要用在各种数据统计的sql中,感觉比group by好用的都,可以在一个查询中对多列数据进行分组,尤其在多表关联查询中,row_number() over()还是非常便捷的。

上述内容就是Oracle中怎么利用row_number()over()方式解决插入数据时重复键,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。