分享

oracle中右表有过滤条件的left outer join

 张小龙net馆藏 2018-03-05

oracle中left outer join就是以左表作为基表来进行连接操作,连接的结果中一定会涵盖基表中所有的列,即使有某些列与右表找不到匹配关系。如下分别是city表和stds表中的数据截图:

   


现在执行以下语句:
select city.name,stds.sid,stds.sname from city left outer join stds on city.id=stds.cid;
其结果截图如下,即使没有湖南的学生,湖南那一项仍然在结果集中,因为city表是基表,它的每一项都会在结果集中。



现在我们假如要获取sid不等于4的情况的左连接结果,那么有两种选择,一种是在on中添加条件限制,一种是在where中添加条件限制,我们现在来测试两种结果是否相同。

先执行在on中添加条件,执行以下语句:
select city.name,stds.sid,stds.sname from city left outer join stds on city.id=stds.cid and stds.sid!=4;
执行结果和执行计划如下:



查看执行结果,我们可以看到结果中仍然包括了基表,也就是city表中的所有行。然后再查看执行计划,可以看到先是ACCESS内层的STDS表,并且加上filter(SID<>4),然后再和外层的CITY表进行左连接操作,所以仍然可以保证city表中每一行都在结果集中。


再执行where中添加条件,执行语句如下:
select city.name,stds.sid,stds.sname from city left outer join stds on city.id=stds.cid where stds.sid!=4
其执行结果如下图所示:


由于sql的执行顺序是先from得到源数据,再where筛选数据,最后select投影数据。先join之后,结果集中应该有
sid为null的结果项,但是由于oracle中任何与null做=或者!=等逻辑判断得到的结果都是unknown,归为false,
所以sid为null的项最终会被剔除掉,而sid=4的数据项也会被剔除掉,所以才出现了上述结果。


下面是做的一个null做等于判断和不等于判断的截图:



所以如果做左外连接时,如果右表带条件约束,它把条件约束放在on中和where中得到的结果是不一样的,这时需要根据自己的需求进行选择。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多