前言
在项目中要进行销售数据的导入,需要导入的表结构与旧表结构不一致,遇到行号这个主键的情况,在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下的两条数据自动排序了。
完整的插入代码
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-