组织同步遇到的问题及解决方法
——JOIN关联表中ON,WHERE后面跟条件的区别
1.发现问题:
前段时间同步到报表中心的组织表中同一个部门有两个,而且对应的ERP中的fid也是不同的,过程中的sql语句如下:
select id,
de,
ame,
level,
org.PARENTORGID,
org.ORGADDR,
org.MANAGERID,
org.ORGCLOSE,
org.APPSYSCODE,
org.PARENTCOMPCODE,
orga1.fid,
'2',
atetime,
null,
dept.fid
from OM_ORGANIZATION org
left join deppon009.t_bas_businessdept dept
on trim(dept.fname_l2) = trim(ame)
left join OM_ORGANIZATION org1
on org1.ORGID = org.parentorgid
left join deppon009.t_dp_organizearea orga1
on trim(orga1.fname_l2) = trim(ame)
where ame like '成都郫县红光镇营业部'
and lose = 0
and org.appsyscode = 'DIP';
其中OM_ORGANIZATION为OA中的组织表,t_bas_businessdept为erp中的部门信息表,两个表通过部门名称left join,因为t_bas_businessdept表中“成都郫县红光镇营业部”有两个,所以会查询出两条记录。后来查询ERP部门信息表,发现ERP部门信息表中有两个该营业部,其中一个的是否启用字段为0(即这个部门注销了),一个的是否启用字段为1(即这个部门是有效的)。
connect和join的区别2.解决问题:
为了解决如果ERP中部门名称相同而且其中一个注销能够正确同步组织,需要加入条件把ERP中注销的那个组织筛选掉,所以在where条件后面加入了条件dept.fisused=1,即
这样问题虽然解决了,但过了几天又出现了一个新的问题,同步组织的过程执行完之后有几个组织还是没有同步过来(即表报中心的组织表中没有)。原因是这几个部门是新开的部门,OA的组织里面加入了该部门,但ERP里面暂时还没有,即OM_ORGANIZATION表中有了该部门,但t_bas_businessdept表中没有该部门,这样left join 虽然是以OM_ORGANIZATION为主表去关联 t_bas_businessdept,即使关联不到OM_ORGANIZATION表中的信息查询结果中应该有,但加了where 条件之后因为没有匹配到对应的t_bas_businessdept表里的信息,因此被筛选掉了,所以没有同步到报表中心。正确的解决办法是吧条件加到left join 的on后面,这样前面的ERP中若有两个名称相同的组织的问题也会解决,OA中有组织,ERP中暂时没有关联不上就被筛选掉而同步不了的问题也会解决。
3.总结问题:
把条件放在where之后和on之后的区别:就拿以上的例子说明,把dept.fisused=1放到wher
e之后查询,是现根据名称去匹配,即OM_ORGANIZATION表和t_bas_businessdept用部门名称左连接,然后再在查询出的结果中去筛选dept.fisused=1的结果。如果OM_ORGANIZATION表中有某个营业部,而ERP中部门信息表中没有,则用left join 之后t_bas_businessdept中的信息都是空的,因此当然不满足条件dept.fisused=1了,所以被筛选掉了。如果是把dept.fisused=1放在on 之后,left join 的时候会把OM_ORGANIZATION表中的部门名称和t_bas_businessdept表中满足dept.fisused=1的的部门去关联,即先把t_bas_businessdept表中满足dept.fisused=1的部门查询出来再去关联,即使没有关联到对应的信息,因为使用的是left join ,所以OM_ORGANIZATION表中的信息是可以查出来的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论