前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle利用row_number()over()方式解决插入数据时重复键的问题

Oracle利用row_number()over()方式解决插入数据时重复键的问题

作者头像
Vaccae
发布2019-07-24 14:10:13
1.6K0
发布2019-07-24 14:10:13
举报
文章被收录于专栏:微卡智享

前言

在项目中要进行销售数据的导入,需要导入的表结构与旧表结构不一致,遇到行号这个主键的情况,在Oracle中可以利用row_number()的方式进行行数处理。

函数介绍

row_number() over(partition by 分组列 order by 排序列 desc)

代码实现

导入目的表

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

源表

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

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

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

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

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

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

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

完整的插入代码

代码语言:javascript
复制
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()还是非常便捷的。

-END-

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档