日期:2014-05-16  浏览次数:20768 次

多个left join执行顺序
1. 求教多个left join 怎么执行 
eg:
 select * from a left join b on a.abid = b.baid left join  c  on c.cbid = b.bcid 

2.多个left join连接,记录条数是不是主表的条数 
eg 
  select * from a 
        left join b on a.abid = b.baid 
        left join  c  on c.cbid = b.bcid 
        ...
没有where语句   那么查询出来的结果集条数是不是等于a的记录条数
------解决方案--------------------
先说明2点:
1、left join是逻辑操作符,只用于保证“数据正确”
2、优化器才是最终决定执行顺序的地方,一般来说会按照你的意愿顺序去执行,但是并不完全能保证。

回答你的问题:
1. 求教多个left join 怎么执行 
eg:
 select * from a left join b on a.abid = b.baid left join  c  on c.cbid = b.bcid 
顺序是先a,b组合成一个虚拟表,然后虚拟表再和C表关联

2.多个left join连接,记录条数是不是主表的条数 
eg 
  select * from a 
        left join b on a.abid = b.baid 
        left join  c  on c.cbid = b.bcid 
        ...
没有where语句   那么查询出来的结果集条数是不是等于a的记录条数
左联的意思是返回左表的数据,右表中不能匹配出来的数据以null标识,但是由于你C表是和B左联而不是和A左联,所以数量不一定是A的数量,看清楚,不一定而已
------解决方案--------------------
即使是A LOJ B的结果,记录条数也不一定等于A的记录条数,除非join predicate右边(也就是B表)的列是唯一的。
------解决方案--------------------
引用:
先说明2点:
1、left join是逻辑操作符,只用于保证“数据正确”
2、优化器才是最终决定执行顺序的地方,一般来说会按照你的意愿顺序去执行,但是并不完全能保证。

回答你的问题:
1. 求教多个left join 怎么执行 
eg:
 select * from a left join b on a.abid = b.baid left join  c  on c.cbid = b.bcid 
顺序是先a,b组合成一个虚拟表,然后虚拟表再和C表关联

2.多个left join连接,记录条数是不是主表的条数 
eg 
  select * from a 
        left join b on a.abid = b.baid 
        left join  c  on c.cbid = b.bcid 
        ...
没有where语句   那么查询出来的结果集条数是不是等于a的记录条数
左联的意思是返回左表的数据,右表中不能匹配出来的数据以null标识,但是由于你C表是和B左联而不是和A左联,所以数量不一定是A的数量,看清楚,不一定而已





------解决方案--------------------
关于LEFT JOIN的内容 你可以去看看SQL SERVER 2005技术内幕。

简单的说就是左匹配 如果只有两个表的话,数据确定与左表相同。

如果是多个表的话 按照顺序A,B表先组成虚拟表 然后再一次匹配。
------解决方案--------------------
引用:
关于LEFT JOIN的内容 你可以去看看SQL SERVER 2005技术内幕。

简单的说就是左匹配 如果只有两个表的话,数据确定与左表相同。

如果是多个表的话 按照顺序A,B表先组成虚拟表 然后再一次匹配。


作为左联结果,数据应该是〉=左表。因为当右表的关联字段有重复的话,就会连多了。
------解决方案--------------------