您的位置:首页 > 其它

无唯一性字段情况下,双表关联更新数据方案

2016-03-24 22:45 411 查看
需求是:
公司早先在另一个数据源D1整合了一套数据到项目中,如下文player数据,现又在新数据D2采集了一套新数据,想用D2的数据值更新公司现项目,要保留现项目的表id。
项目中的数据id用的是数据源D1的,针对player表,如下图,D1、D2该表均无唯一性标注字段,只能通过姓名勉强匹配。
D1、D2中均有2条梅西的数据,实际上需将D2中id为3的数据更新到D1中id为1的梅西数据。
对于D1中有,D2中无的数据(如卡卡),不更新其值。



1.
1.1player_source的值为



1.2player_dest与未关联转换表的更新语句



2.
因此,我们需要先整理出两个数据源间的id对应关系表,如下图表明,目的表的id为1的梅西,应该用源头表id为3的梅西进行更新



新的SQL如下:



从图中我们看出,dest表的梅西数据被成功更新,但是,其它数据被更新成空值了。还原下数据,重新修改SQL
3.从下图我们看到dest表的数据有按需更新。



4.但是,我觉得这样的SQL效率并不高。而且我本次的方案,必须基于先整理出转换表为前提,这个转换表数据,我可以通过SQL语句暂时造一部分出来,因数据冗余及脏乱数据造成的转换缺失,可通过人工干预生成,随着数据源的变动,这个转换表必然要随着修改,这是一个不小的工作量。恳请技术、方案指教。
SQL语句如下:
UPDATE player_dest dest SET dest.c1 = ( SELECT source.c1 FROM player_source source WHERE dest. NAME = source. NAME AND EXISTS ( SELECT 1 FROM player_tran tran WHERE tran.source_id = source.id AND dest.id = tran.dest_id AND tran.dataprovider = 'juhe' ))
WHERE EXISTS ( SELECT 1 FROM PLAYER_TRAN TRAN WHERE TRAN.DEST_ID = dest.ID );

5.最麻烦的是,新数据源D2中有,而公司数据源D1中无的那些新增数据,其id要用公司数据源D1中的最大id+1,获取这个最大id,这样的SQL语句也显得很麻烦!再试想,万一新数据源D2不靠谱,那个新增的数据假设为“穆里尼奥”,这个月的id是100,下个月变为1000,这样可就麻烦了。

6.我曾经整理过这样的数据,想起来都觉得当时每天压力好大。后来是直接放弃采用数据源。该模块的数据交由另一家乙方公司推倒重做。当时在一家金融甲方现场做项目开发,前期遗留的脏乱太多,人员表中一人多号的现象十分严重,之前施工的同事遗留下一大堆坑。如果基础底层模块都没有打好,就拼命催着加后面的工程,很容易就是一个豆腐渣工程,而且有不少并没有太多责任心的同事(或者说对项目前景的潜在风险没有太多预见性的同事),现在有太多这样的软件豆腐渣工程了。其它的我就不多说了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: