经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
一起来找茬(1)-开发写的神奇左连接
来源:cnblogs  作者:lucky_pin  时间:2019/4/22 8:54:45  对本文有异议

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

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

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

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

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

  1. CREATE VIEW V_ZB AS
  2. SELECT ZB.ID, ZB.NAME, LX1.A_DM DM1, LX2.A_DM DM2
  3. FROM ZB
  4. LEFT JOIN DZB LX1
  5. ON ZB.B_DM1 = LX1.B_DM
  6. LEFT JOIN DZB LX2
  7. ON ZB.B_DM2 = LX2.B_DM
  8. WHERE LX1.LX = 'lx1'
  9. AND LX2.LX = 'lx2';

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

 

  1. /*原因是where条件那里筛去了未连接上的数据,就是left join 变成join了。where条件那里使用对照表的lx筛选本意是想获取不同类型的对照数据(如证件类型对照、地址行政区划对照)拿来做左连接。但没连接上的对照表类型值都是null,又怎么经得起lx=某类型的筛选呢?
  2. 真实业务场景中由于某个字段经常缺数,加上需要对照转换的字段比较多,所以一条数据都出不来。
  3. 这种情况还是老老实实拆分成证件类型对照表、地址行政区划对照表这样不同的对照表。或者筛选lx=类型那里加多一个 or is null。*/
  4. CREATE VIEW V_ZB AS
  5. SELECT ZB.ID,ZB.NAME,LX1.A_DM DM1,LX2.A_DM DM2 FROM ZB
  6. LEFT JOIN DZB LX1 ON ZB.B_DM1=LX1.B_DM
  7. LEFT JOIN DZB LX2 ON ZB.B_DM2 = LX2.B_DM
  8. WHERE (LX1.LX='lx1' OR LX1.LX IS NULL)
  9. AND (LX2.LX='lx2' OR LX2.LX IS NULL);
原因是...

 修改后,得到如下图的结果就合适了(?•??•?)??

 

 

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

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

原文链接:http://www.cnblogs.com/lucky-pin/p/10740481.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号