RT,我已经知道左连接就是以左边的表为准,关联后的结果应该是记录条数至少要大于等于左边那个表的记录条数吧。但是现在我在项目中有如下情况,A表和C表内关联有结果A表和B表做关联也有结果之后用A和B左连接的结果再和C左连接   居然没结果了,为什么呀?理论上应该出来的条数总是大于或者等于左边那个表的条数的呀

解决方案 »

  1.   


    外连接: 包括 
         (1)左外连接(左边的表不加限制) 
         (2)右外连接(右边的表不加限制) 
         (3)全外连接(左右两表都不加限制) 
    --右外连接
    SQL> select e.ename,d.deptno,e.sal
      2  from emp e,dept d
      3  where e.deptno(+)=d.deptno;ENAME      DEPTNO       SAL
    ---------- ------ ---------
    SMITH          20    800.00
    ALLEN          30   1600.00
    WARD           30   1250.00
    JONES          20   2975.00
    MARTIN         30   1250.00
    BLAKE          30   2850.00
    CLARK          10   2450.00
    SCOTT          20   3000.00
    KING           10   5000.00
    TURNER         30   1500.00
    ADAMS          20   1100.00
    JAMES          30    950.00
    FORD           20   3000.00
    MILLER         10   1300.00
                   40 
    --左外连接
    select a.studentno, a.studentname, b.classname
           from students a, classes b
          where a.classid = b.classid(+);STUDENTNO STUDENTNAM CLASSNAME
    ---------- ---------- ------------------------------
             1 aa         一年级一班
             2 bb         一年级二班
             3 aa
      

  2.   

    很有可能sql语句写得有问题......
      

  3.   


    我看了没问题的   和B,C关联的字段都是A的字段
      

  4.   

    是不是有where条件啊?有where的话,可能给过滤掉了
      

  5.   


    呃   是有where条件   怎么过滤掉的呢? 
      

  6.   

    where 条件如果直接写在最后面可能会过滤掉,我们需要用 (a is null or a = ...) 来加过滤,最好是直接写成 left join ... on  这种不容易造成错觉,连接的条件就加在连接上,过滤的条件就加在 where 上,更容易理清。where 中如果要过滤“右表”时,需要写成 (右表.连接任意一个字段 is null or 右表的条件=xxx),右表.连接任意一个字段 is null 表示左连接已经命中的(右表不存在嘛),不需要再过滤它了,只需要对 右表已经连接的记录做过滤。
      

  7.   

    右外连接
    SQL> select e.ename,d.deptno,e.sal
      2  from emp e,dept d
      3  where e.deptno(+)=d.deptno;
      

  8.   


    详解Oracle多种表连接方式