ORACLE中多对多关系处理的问题及解决思路

声明: 只是记录工作中遇到的问题及解决思路,只能满足当前我个人的业务需求

问题1

工作中遇到一个需求:有两份来自不通系统且字段相同的数据,现在需要对它们对比(字段值逐一比较),然后以其中一份(事先选定)数据为标准,给对比的结果打标签。
如果把两份数据分别标记为A和B,且以A数据为标准,那么:
1.存在于A但是不存在于B的数据为【新增】数据;
2.存在于B但是不存在于A的数据为【删除】数据;
3.都存在于A和B,且字段值完全相等的数据为【为变化】数据;
4.剩余的就是【修改】数据。
这个思路还是蛮清晰的,但是这两份数据存在一个问题:需要关联的字段并不是唯一主键。具体来说,有两个字段,分别是:中心编码和部门编码。一个中心可能挂多个部门,我们对比主要是要看中心。本来想的思路是,一个部门只对应一个中心,那先拿中心编码关联,再拿部门编码去关联不就好了吗?
但是,看这一种情况:

数据A

中心编码部门编码
1A
1B

数据B

中心编码部门编码
1C
1D

如果按照部门去关联,发现数据A中根本没有C和D这两个部门,按照上述判断逻辑,A中的那两条数据会被标记为:新增
实际上这两条数据应该为:修改

解决思路

一种解决的方案是:
1.先按照上述判断逻辑打标;
2.去对比结果中,筛选出被标记为:新增的数据,再通过中心编码分组,统计记录条数;同样的方法,统计数据B的中心编码和对应记录条数。把这两个结果的记录条数做对比,如果相同,说明这些数据都应该被标记为【修改】;如果不同,假设记录数的差为n,那这n条数据就是【新增】,其余的是【修改】。(这里保证A数据条数 >= B数据条数)。

但是,又有一个问题,如果n > 0,我怎么知道到底哪n条是新增的,剩下的是修改的呢?
这里只能随便选了,看个例子

数据A

中心编码部门编码
1A
1B

数据B

中心编码部门编码
1C

这里对比结果,A的两条数据都会被先标记为新增,然后,我们对比数据条数的差,发现A比B多一条,那么按照上述逻辑,A数据其中一条是修改,其中一条是新增。那我就随便选一条更新为修改,就可以了。

问题2

延续问题1,现在需要把标记为【修改】的数据的其中一个字段,比如说:手工码,标记为数据B的手工码。
但是,打的更新标签是随机选的,我怎么找到对应的手工码呢?

解决思路

还是随机选,但是要去重,比如:

数据A

中心编码部门编码手工码
1Anull
1Bnull

数据B

中心编码部门编码手工码
1C123
1D321

B的手工码有:123、321, 分别随机赋值给A的手工码就可以了。这一步在业务层很好做,但是我就是想直接写sql,咋办呢。
可以分别给两份数据标上行号,那么直接更新对应行号的数据就可以了,比如:

数据A

中心编码部门编码手工码行号
1Anull1
1Bnull2

数据B

中心编码部门编码手工码行号
1C1231
1D3212

只要通过行号关联,然后更新就可以了,巧妙!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值