Left Join...ON与Where


事情是这样的,前两天楼主正在测试一段SQL,为了便于分析,我只需要返回一条数据,

于是乎,楼主很想当然的在SQL的最后加了一个条件如:and ID=XXX。

这里ID相对于每条记录都是唯一的,但是当我执行SQL,返回的记录和原来的SQL返回数目无异。

当时楼主觉得难以理解,对SQL重新分析过后发现了其中问题。

过滤条件切勿写在Left Join的On语句之后。这样的写法对整条SQL不仅起不到过滤作用,而且还会影响整个返回的数据集。(除非你的需求就是如此)

这个虽然不是很复杂高深的问题,但是个人觉得却是一个值得分享的细节。这里我用一个简单的例子来说明。


原始的SQL

select empno, ename, d.dname
  from emp e
 left join dept d
    on e.deptno = d.deptno;

返回: 结果集1

Left Join...ON与Where_第1张图片


然后我尝试只返回红线选中的那条记录,于是加了一个condition

select empno, ename, d.dname
  from emp e
 left join dept d
    on e.deptno = d.deptno
   and e.empno = 7935;
返回:  结果集2

Left Join...ON与Where_第2张图片

发现返回的数目没有变化,几经检查,楼主才惊觉,condition加到了left Join的ON语句后面。

这里的条件不会影响主表返回的记录行数,倒是影响了Join的条件,使其他数据返回都为空。

正确的过滤条件应该放在Where之后

select empno, ename, d.dname
  from emp e
  left join dept d
    on e.deptno = d.deptno
 where e.empno = 7935;

返回  结果集3:


小结:

Left Join..on之后的条件只作为表连接的条件使用,而不会作为过滤条件来控制结果集的返回行数。

如第二段SQL中的 on e.deptno = d.deptno and e.empno = 7935,通过这个条件来进行表连接,自然而然的只有一行记录能被Join到,

其他无法Join到的数据也就返回为空。而真正需要在Left Join之后控制返回的记录,这样的条件就得放在Where语句之后了。

对于Inner Join,就不存在这两种写法的差异。




你可能感兴趣的:(Oracle数据库)