一起来找茬(1)-开发写的神奇左连接

近期在给客户做新数据交换方案调试时发现一处视图创建语句带不出数据。

精简需求后如下:a部门从b部门获取主体数据,由于a、b两部门有些代码标准不一致需要做转换。于是开发写了个对照表做转换生成业务视图。

主表zb数据如下,B_MD1和B_DM2是两种类型代码,分别是lx1和lx2(比如一个是证件类型代码一个地址行政区划代码)。主表某些字段有缺失数据的情况。

为图省事,开发将不同类型的代码对照表记录在同一张对照表(dzb)中,如下图

业务需求是创建视图查出所有主表的数据,允许出现某些字段数据缺失的情况。并将两部门标准不一致的代码做转换。然后开发这货写出了如下视图。

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';

得到如下结果。什么......李四去哪了?Σ( ° △ °|||)︴调试的时候是一万多主表数据,视图里一条都没能查出来。(╯°Д°)╯︵┻━┻(

 

/*原因是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);
原因是...

 修改后,得到如下图的结果就合适了(๑•̀ㅂ•́)و✧

 

 

-------------------------------------------------------------------------------------------

@luqp 本文地址 https://www.cnblogs.com/lucky-pin/p/10740481.html

posted @ 2019-04-20 12:12  lucky_pin  阅读(634)  评论(0编辑  收藏  举报