select a.字段,b.字段,c.字段
from a
left join b on b.id=a.id
left join c on b.某字段=c.某字段理解成数据库先执行了
select a.字段,b.字段,c.字段
from a
left join b on b.id=a.id
然后将上面语句的结果集再left join c on b.某字段=c.某字段
我的理解对吗?如不对请赐教。

解决方案 »

  1.   

    LEFT [ OUTER ]
    指定在结果集中包括左表中所有不满足联接条件的行,并在由内部联接返回所有的行之外,将另外一个表的输出列设为 NULL。
      

  2.   

    楼主以上语句,是以显示所有A表数据,在B满足条件时显示B表数据,不满足时B显示为NULL
    在满足B同时满足C条件时显示C表数据,其它C表显示为NULL
      

  3.   


    declare @表A table (aID int,aNum varchar(9))
    insert into @表A
    select 1,'a20050111' union all
    select 2,'a20050112' union all
    select 3,'a20050113' union all
    select 4,'a20050114' union all
    select 5,'a20050115'
     
     
    declare @表B table (bID int,bName varchar(12))
    insert into @表B
    select 1,'2006032401' union all
    select 2,'2006032402' union all
    select 3,'2006032403' union all
    select 4,'2006032404' union all
    select 8,'2006032408'
     
    --左联等价于 left outer join (一个表的所有行和另一个表满足条件的行)
    select * from @表A a left join @表B b on a.aID=b.bID;
       
    /*
    aID         aNum      bID         bName
    ----------- --------- ----------- ------------
    1           a20050111 1           2006032401
    2           a20050112 2           2006032402
    3           a20050113 3           2006032403
    4           a20050114 4           2006032404
    5           a20050115 NULL        NULL
    */
     
    --右联等价于 right outer join
    select * from @表A a right join @表B b on a.aID=b.bID;
     
    /*
    aID         aNum      bID         bName
    ----------- --------- ----------- ------------
    1           a20050111 1           2006032401
    2           a20050112 2           2006032402
    3           a20050113 3           2006032403
    4           a20050114 4           2006032404
    NULL        NULL      8           2006032408
    */
     
    --笛卡尔乘积
    select * from @表A a cross join @表B b;
     
    /*
    aID         aNum      bID         bName
    ----------- --------- ----------- ------------
    1           a20050111 1           2006032401
    2           a20050112 1           2006032401
    3           a20050113 1           2006032401
    4           a20050114 1           2006032401
    5           a20050115 1           2006032401
    1           a20050111 2           2006032402
    2           a20050112 2           2006032402
    3           a20050113 2           2006032402
    4           a20050114 2           2006032402
    5           a20050115 2           2006032402
    1           a20050111 3           2006032403
    2           a20050112 3           2006032403
    3           a20050113 3           2006032403
    4           a20050114 3           2006032403
    5           a20050115 3           2006032403
    1           a20050111 4           2006032404
    2           a20050112 4           2006032404
    3           a20050113 4           2006032404
    4           a20050114 4           2006032404
    5           a20050115 4           2006032404
    1           a20050111 8           2006032408
    2           a20050112 8           2006032408
    3           a20050113 8           2006032408
    4           a20050114 8           2006032408
    5           a20050115 8           2006032408
    */
     
    --内联等价于 inner join
    select * from @表A a join @表B b on a.aID=b.bID;
     
    /*
    aID         aNum      bID         bName
    ----------- --------- ----------- ------------
    1           a20050111 1           2006032401
    2           a20050112 2           2006032402
    3           a20050113 3           2006032403
    4           a20050114 4           2006032404
    */
     
    --外联
    select * from @表A a full outer join @表B b on a.aID=b.bID;
     
    /*
    aID         aNum      bID         bName
    ----------- --------- ----------- ------------
    1           a20050111 1           2006032401
    2           a20050112 2           2006032402
    3           a20050113 3           2006032403
    4           a20050114 4           2006032404
    5           a20050115 NULL        NULL
    NULL        NULL      8           2006032408
    */参考理解下!
      

  4.   

    和一个left join是一个道理的
      

  5.   

    以上几位说的都挺对的.我就不再重复了.
    在此针对楼主指出.
    数据库先执行了 left join b on b.id=a.id
    然后将上面语句的结果集再left join c on b.某字段=c.某字段
    换句话说也就是一层一层的left join下来,
    最后执行select a.字段,b.字段,c.字段 输出结果
    如有不对欢迎探讨.
      

  6.   

    执行是一层一层日,但结果是按on的条件来显示
    可以测试一下,相同结构的三个表
    select * 
    from Table_2 a left join Table_3 b 
                   on a.CODE =b.CODE 
                   left join Table_4 c                on b.CODE =c.CODE

    select * 
    from Table_2 a left join Table_3 b 
                   on a.CODE =b.CODE 
                   left join Table_4 c                on a.CODE =c.CODE
    他们的结果是不一样的
      

  7.   


    同意.只是说这里最后执行Select * 输出结果.但是结果取决于条件语句