多个left join执行顺序

时间:2022-08-15 19:56:50
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的记录条数

14 个解决方案

#1


先说明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的数量,看清楚,不一定而已

#2


即使是A LOJ B的结果,记录条数也不一定等于A的记录条数,除非join predicate右边(也就是B表)的列是唯一的。

#3


引用 1 楼 DBA_Huangzj 的回复:
先说明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执行顺序

#4


关于LEFT JOIN的内容 你可以去看看SQL SERVER 2005技术内幕。

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

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

#5


引用 4 楼 fredrickhu 的回复:
关于LEFT JOIN的内容 你可以去看看SQL SERVER 2005技术内幕。

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

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


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

#6


引用 1 楼 DBA_Huangzj 的回复:
先说明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表先和b表left join 生成虚拟表(假设为T1),b表和c表left join生成虚拟表(假设为T2),最后两个虚拟表怎么办呢?是T1和T2 执行left join吗?

#7


引用 6 楼 hwhmh2010 的回复:
Quote: 引用 1 楼 DBA_Huangzj 的回复:

先说明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表先和b表left join 生成虚拟表(假设为T1),b表和c表left join生成虚拟表(假设为T2),最后两个虚拟表怎么办呢?是T1和T2 执行left join吗?
不是,是T1直接和Cleft join

#8


1、left join只是一个表关联运算,顺序是从第一个表开始往后依次关联

2、不一定等于a的条数,当a表和b表关联采用主键进行关联时,无论b表是否有和a表已有数据匹配的数目,那么都返回a表已有数据数目,匹配不上的都显示为null。当进行关联的字段并非主键,那么就会出现一条记录匹配多条记录的情况,最坏的情况就是笛卡尔积的数目

#9


引用 7 楼 DBA_Huangzj 的回复:
Quote: 引用 6 楼 hwhmh2010 的回复:

Quote: 引用 1 楼 DBA_Huangzj 的回复:

先说明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表先和b表left join 生成虚拟表(假设为T1),b表和c表left join生成虚拟表(假设为T2),最后两个虚拟表怎么办呢?是T1和T2 执行left join吗?
不是,是T1直接和Cleft join

(⊙o⊙)哦哦,晓得了,3Q

#10


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表,通过abid 和 baid 字段来关联,得出一个结果集,然后再用这个结果集 和 b表进行关联,通过cid 和 c表的cbid进行连接

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的记录条数。

不一定,如果a表和b表,而b表和c表,关联的字段都是一一对应的,也就是比如,a表的一个abid对应一个,b表的baid,而c表的一个cbid 和 b表的一个bcid 值,那么最后会返回a表的记录数。

如果不是一对一,那么,就会返回多条记录,比如a表时10条记录,最后可能返回30条数据,这个都不一定的 

#11


谢谢大家了 已经知道怎么回事了 这几天太忙 没顾上来看 分太少 没给到的不要介意啊

#12


学习了,谢谢大家

#13


学习了,谢谢

#14


学习了,谢谢

#1


先说明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的数量,看清楚,不一定而已

#2


即使是A LOJ B的结果,记录条数也不一定等于A的记录条数,除非join predicate右边(也就是B表)的列是唯一的。

#3


引用 1 楼 DBA_Huangzj 的回复:
先说明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执行顺序

#4


关于LEFT JOIN的内容 你可以去看看SQL SERVER 2005技术内幕。

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

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

#5


引用 4 楼 fredrickhu 的回复:
关于LEFT JOIN的内容 你可以去看看SQL SERVER 2005技术内幕。

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

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


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

#6


引用 1 楼 DBA_Huangzj 的回复:
先说明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表先和b表left join 生成虚拟表(假设为T1),b表和c表left join生成虚拟表(假设为T2),最后两个虚拟表怎么办呢?是T1和T2 执行left join吗?

#7


引用 6 楼 hwhmh2010 的回复:
Quote: 引用 1 楼 DBA_Huangzj 的回复:

先说明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表先和b表left join 生成虚拟表(假设为T1),b表和c表left join生成虚拟表(假设为T2),最后两个虚拟表怎么办呢?是T1和T2 执行left join吗?
不是,是T1直接和Cleft join

#8


1、left join只是一个表关联运算,顺序是从第一个表开始往后依次关联

2、不一定等于a的条数,当a表和b表关联采用主键进行关联时,无论b表是否有和a表已有数据匹配的数目,那么都返回a表已有数据数目,匹配不上的都显示为null。当进行关联的字段并非主键,那么就会出现一条记录匹配多条记录的情况,最坏的情况就是笛卡尔积的数目

#9


引用 7 楼 DBA_Huangzj 的回复:
Quote: 引用 6 楼 hwhmh2010 的回复:

Quote: 引用 1 楼 DBA_Huangzj 的回复:

先说明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表先和b表left join 生成虚拟表(假设为T1),b表和c表left join生成虚拟表(假设为T2),最后两个虚拟表怎么办呢?是T1和T2 执行left join吗?
不是,是T1直接和Cleft join

(⊙o⊙)哦哦,晓得了,3Q

#10


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表,通过abid 和 baid 字段来关联,得出一个结果集,然后再用这个结果集 和 b表进行关联,通过cid 和 c表的cbid进行连接

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的记录条数。

不一定,如果a表和b表,而b表和c表,关联的字段都是一一对应的,也就是比如,a表的一个abid对应一个,b表的baid,而c表的一个cbid 和 b表的一个bcid 值,那么最后会返回a表的记录数。

如果不是一对一,那么,就会返回多条记录,比如a表时10条记录,最后可能返回30条数据,这个都不一定的 

#11


谢谢大家了 已经知道怎么回事了 这几天太忙 没顾上来看 分太少 没给到的不要介意啊

#12


学习了,谢谢大家

#13


学习了,谢谢

#14


学习了,谢谢