• 一起来找茬(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

  • 相关阅读:
    Selenium系列教程(2)
    如何清除浏览器缓存?
    菜鸟学自动化测试(一)----selenium IDE
    Python风格规范
    NSURLSession使用说明及后台工作流程分析
    iOS如何生成.a文件
    Apple移动设备处理器指令集 armv6、armv7、armv7s及arm64
    使用Xcode和Instruments调试解决iOS内存泄露
    Instruments使用实战
    正则表达式在iOS中的运用
  • 原文地址:https://www.cnblogs.com/lucky-pin/p/10740481.html
Copyright © 2020-2023  润新知