近期在给客户作新数据交换方案调试时发现一处视图建立语句带不出数据。html
精简需求后以下:a部门从b部门获取主体数据,因为a、b两部门有些代码标准不一致须要作转换。因而开发写了个对照表作转换生成业务视图。ide
主表zb数据以下,B_MD1和B_DM2是两种类型代码,分别是lx1和lx2(好比一个是证件类型代码一个地址行政区划代码)。主表某些字段有缺失数据的状况。spa
为图省事,开发将不一样类型的代码对照表记录在同一张对照表(dzb)中,以下图调试
业务需求是建立视图查出全部主表的数据,容许出现某些字段数据缺失的状况。并将两部门标准不一致的代码作转换。而后开发这货写出了以下视图。code
CREATE VIEW V_ZB AS SELECT ZB.ID, ZB.NAME, LX1.A_DM DM1, LX2.A_DM DM2 FROM ZB LEFT JOIN DZB LX1 ON ZB.B_DM1 = LX1.B_DM LEFT JOIN DZB LX2 ON ZB.B_DM2 = LX2.B_DM WHERE LX1.LX = 'lx1' AND LX2.LX = 'lx2';
获得以下结果。什么......李四去哪了?Σ( ° △ °|||)︴调试的时候是一万多主表数据,视图里一条都没能查出来。(╯°Д°)╯︵┻━┻(htm
/*缘由是where条件那里筛去了未链接上的数据,就是left join 变成join了。where条件那里使用对照表的lx筛选本意是想获取不一样类型的对照数据(如证件类型对照、地址行政区划对照)拿来作左链接。但没链接上的对照表类型值都是null,又怎么经得起lx=某类型的筛选呢? 真实业务场景中因为某个字段常常缺数,加上须要对照转换的字段比较多,因此一条数据都出不来。 这种状况仍是老老实实拆分红证件类型对照表、地址行政区划对照表这样不一样的对照表。或者筛选lx=类型那里加多一个 or is null。*/ CREATE VIEW V_ZB AS SELECT ZB.ID,ZB.NAME,LX1.A_DM DM1,LX2.A_DM DM2 FROM ZB LEFT JOIN DZB LX1 ON ZB.B_DM1=LX1.B_DM LEFT JOIN DZB LX2 ON ZB.B_DM2 = LX2.B_DM WHERE (LX1.LX='lx1' OR LX1.LX IS NULL) AND (LX2.LX='lx2' OR LX2.LX IS NULL);
修改后,获得以下图的结果就合适了(๑•̀ㅂ•́)و✧blog
-------------------------------------------------------------------------------------------开发
@luqp 本文地址 http://www.javashuo.com/article/p-cvwfcibc-bq.htmlget