多个left join执行顺序

l616067603 2014-03-24 11:36:35
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的记录条数
...全文
31016 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
王小军08 2016-11-11
  • 打赏
  • 举报
回复
学习了,谢谢
qq_33922469 2016-02-03
  • 打赏
  • 举报
回复
学习了,谢谢
阿释密达丶 2015-02-11
  • 打赏
  • 举报
回复
学习了,谢谢大家
l616067603 2014-03-29
  • 打赏
  • 举报
回复
谢谢大家了 已经知道怎么回事了 这几天太忙 没顾上来看 分太少 没给到的不要介意啊
LongRui888 2014-03-25
  • 打赏
  • 举报
回复
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条数据,这个都不一定的
山寨DBA 2014-03-25
  • 打赏
  • 举报
回复
引用 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吗?[/quote]不是,是T1直接和Cleft join[/quote] (⊙o⊙)哦哦,晓得了,3Q
KeepSayingNo 2014-03-25
  • 打赏
  • 举报
回复
1、left join只是一个表关联运算,顺序是从第一个表开始往后依次关联 2、不一定等于a的条数,当a表和b表关联采用主键进行关联时,无论b表是否有和a表已有数据匹配的数目,那么都返回a表已有数据数目,匹配不上的都显示为null。当进行关联的字段并非主键,那么就会出现一条记录匹配多条记录的情况,最坏的情况就是笛卡尔积的数目
發糞塗牆 2014-03-25
  • 打赏
  • 举报
回复
引用 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吗?[/quote]不是,是T1直接和Cleft join
山寨DBA 2014-03-25
  • 打赏
  • 举报
回复
引用 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吗?
spiritofdragon 2014-03-25
  • 打赏
  • 举报
回复
引用 4 楼 fredrickhu 的回复:
关于LEFT JOIN的内容 你可以去看看SQL SERVER 2005技术内幕。 简单的说就是左匹配 如果只有两个表的话,数据确定与左表相同。 如果是多个表的话 按照顺序A,B表先组成虚拟表 然后再一次匹配。
作为左联结果,数据应该是〉=左表。因为当右表的关联字段有重复的话,就会连多了。
--小F-- 2014-03-25
  • 打赏
  • 举报
回复
关于LEFT JOIN的内容 你可以去看看SQL SERVER 2005技术内幕。 简单的说就是左匹配 如果只有两个表的话,数据确定与左表相同。 如果是多个表的话 按照顺序A,B表先组成虚拟表 然后再一次匹配。
直面人生 2014-03-25
  • 打赏
  • 举报
回复
引用 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的数量,看清楚,不一定而已
FancyMouse 2014-03-25
  • 打赏
  • 举报
回复
即使是A LOJ B的结果,记录条数也不一定等于A的记录条数,除非join predicate右边(也就是B表)的列是唯一的。
發糞塗牆 2014-03-25
  • 打赏
  • 举报
回复
先说明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的数量,看清楚,不一定而已

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧