JOIN ON后面的过滤条件和where后面的过滤条件有什么不同?
2010-02-03 19:41
337 查看
今天做报表过滤时:
需要在系统产生的sql上增加过滤条件,刚开始为了代码的书写方便,我直接把过滤条件(T_CYJ_OrgToArea.FAreaID='区域' ,T_CYJ_OrgToState.FOrgIDID=‘业态’)写到了LEFT OUTER JOIN ON后面,源码如下面的黑体字:
from CT_CYK_CustomerBaseInfo" +
" LEFT OUTER JOIN T_BD_Customer ON CT_CYK_CustomerBaseInfo.CFCustNameID=T_BD_Customer.FID");
sql.append(" LEFT OUTER JOIN T_BD_Customer as linCustomer ON CT_CYK_CustomerBaseInfo.CFMainLinkMenID=linCustomer.FID "+
" LEFT OUTER JOIN T_CYJ_CustomerUnit ON CT_CYK_CustomerBaseInfo.CFUnitsOneID=T_CYJ_CustomerUnit.FID "+
" LEFT OUTER JOIN CT_CYK_CustomerBIDIE ON CT_CYK_CustomerBaseInfo.FID=CT_CYK_CustomerBIDIE.FPARENTID and CT_CYK_CustomerBIDIE.CFISMAINDUTY=1 "+
" LEFT OUTER JOIN T_BD_Person ON T_BD_Person.FID=CT_CYK_CustomerBIDIE.CFDUTYPERSONID "+
" LEFT OUTER JOIN t_org_positionmember ON t_bd_person.fid = t_org_positionmember.fpersonid AND t_org_positionmember.fisprimary = 1 "+
" LEFT OUTER JOIN t_org_position ON t_org_positionmember.fpositionid = t_org_position.fid "+
" LEFT OUTER JOIN t_org_unitrelation ON t_org_position.fadminorgunitid = t_org_unitrelation.ffromunitid "+
" LEFT OUTER JOIN t_org_admin ON t_org_unitrelation.ftounitid = t_org_admin.fid
LEFT OUTER JOIN T_CYJ_OrgToArea ON t_org_admin.FID=T_CYJ_OrgToArea.FOrgIDID and and T_CYJ_OrgToArea.FAreaID='区域'
LEFT OUTER JOIN T_CYJ_OrgToState ON T_CYJ_OrgToState.FOrgPropertyID=t_org_admin.FID and T_CYJ_OrgToState.FOrgIDID=‘业态’;
可是结果根本就没有起到过滤的作用。后来经过分析,发现:在left join on后面的过滤条件,实际上只是简单的对左联接的表(T_CYJ_OrgToArea )信息进行了过滤,一旦左联接的表和主表进行左联接,实际上主表没有符合左联接条件的记录,即T_CYJ_OrgToArea 的字段都被赋值为空,实际上主表的数据一条都没有进行过滤。因此,在on后面的过滤条件没有起到应有的过滤效果。
我们在写过滤sql时:一般的目的都是为了对主表的信息进行过滤,此时应当把过滤信息写进where子句中,这样才能实现对主表的过滤。
需要在系统产生的sql上增加过滤条件,刚开始为了代码的书写方便,我直接把过滤条件(T_CYJ_OrgToArea.FAreaID='区域' ,T_CYJ_OrgToState.FOrgIDID=‘业态’)写到了LEFT OUTER JOIN ON后面,源码如下面的黑体字:
from CT_CYK_CustomerBaseInfo" +
" LEFT OUTER JOIN T_BD_Customer ON CT_CYK_CustomerBaseInfo.CFCustNameID=T_BD_Customer.FID");
sql.append(" LEFT OUTER JOIN T_BD_Customer as linCustomer ON CT_CYK_CustomerBaseInfo.CFMainLinkMenID=linCustomer.FID "+
" LEFT OUTER JOIN T_CYJ_CustomerUnit ON CT_CYK_CustomerBaseInfo.CFUnitsOneID=T_CYJ_CustomerUnit.FID "+
" LEFT OUTER JOIN CT_CYK_CustomerBIDIE ON CT_CYK_CustomerBaseInfo.FID=CT_CYK_CustomerBIDIE.FPARENTID and CT_CYK_CustomerBIDIE.CFISMAINDUTY=1 "+
" LEFT OUTER JOIN T_BD_Person ON T_BD_Person.FID=CT_CYK_CustomerBIDIE.CFDUTYPERSONID "+
" LEFT OUTER JOIN t_org_positionmember ON t_bd_person.fid = t_org_positionmember.fpersonid AND t_org_positionmember.fisprimary = 1 "+
" LEFT OUTER JOIN t_org_position ON t_org_positionmember.fpositionid = t_org_position.fid "+
" LEFT OUTER JOIN t_org_unitrelation ON t_org_position.fadminorgunitid = t_org_unitrelation.ffromunitid "+
" LEFT OUTER JOIN t_org_admin ON t_org_unitrelation.ftounitid = t_org_admin.fid
LEFT OUTER JOIN T_CYJ_OrgToArea ON t_org_admin.FID=T_CYJ_OrgToArea.FOrgIDID and and T_CYJ_OrgToArea.FAreaID='区域'
LEFT OUTER JOIN T_CYJ_OrgToState ON T_CYJ_OrgToState.FOrgPropertyID=t_org_admin.FID and T_CYJ_OrgToState.FOrgIDID=‘业态’;
可是结果根本就没有起到过滤的作用。后来经过分析,发现:在left join on后面的过滤条件,实际上只是简单的对左联接的表(T_CYJ_OrgToArea )信息进行了过滤,一旦左联接的表和主表进行左联接,实际上主表没有符合左联接条件的记录,即T_CYJ_OrgToArea 的字段都被赋值为空,实际上主表的数据一条都没有进行过滤。因此,在on后面的过滤条件没有起到应有的过滤效果。
我们在写过滤sql时:一般的目的都是为了对主表的信息进行过滤,此时应当把过滤信息写进where子句中,这样才能实现对主表的过滤。
相关文章推荐
- mysql join on 后面条件与where条件
- left join on、where后面的条件的区别
- mysql中left join on后面and和where条件查询的差异
- left join 过滤条件写在on后面和写在where 后面的区别
- MySQL 中 left join on 后面的条件与 where 后面的条件的区别
- left join on、where后面的条件的区别
- left join on、where后面的条件的区别
- left join 过滤条件写在on后面和写在where 后面的区别
- left join 过滤条件写在on后面和写在where 后面的区别
- JOIN关联表中ON,WHERE后面跟条件的区别
- left join 过滤条件写在on后面和写在where 后面的区别
- JOIN关联表中ON,WHERE后面跟条件的区别
- 注意区分left join on 后面的条件 和where 后面的条件
- JOIN关联表中ON,WHERE后面跟条件的区别
- LEFT JOIN ON 后面跟多个条件和Where的区别
- SQL SERVER inner join on 和where条件的作用范围
- left join on and和left join on where条件的困惑[转]
- PostgreSQL join where 条件不同 explain 执行计划的差别
- left join on 和where条件的放置
- left join on 和where条件的放置