2 worm860530 worm860530 于 2014.12.10 11:19 提问

sql left join 的探讨

select a.xx,b.xx,c.xx from table1 a
left join table2 b on a.xxx = b.xxx
left join table3 c on a.xxx = c.xxx


select a.xx,b.xx,c.xx from table1 a
left join table2 b on a.xxx = b.xxx
left join table3 c on b.xxx = c.xxx


select ab.* from (select a.xx,b.xx from table1 a
left join talbe2 b on a.xxx = b.xxx) ab
left join table3 c on ab.xxx = c.xxx


假设没有语法错误,请问这3种情况查出的数据会是一样的嘛?
我自己test了一下,数据是一样的,但是我感觉跟我理解的left join不一样,不知道是不是我的理解压根就是有问题的
还请大神赐教,以纠正或者肯定我的理解,谢谢

4个回答

xuzuning
xuzuning   Ds   Rxr 2014.12.10 12:54
已采纳

1 式和 2 式是不一样的
3 式视取哪个表的 xxx 而定, a 表的就和 1 式一样,反之与 2 时一样
看个测试:

 create temporary table A
 select 1 as a
 union select 2
 union select 3;

create temporary table B
 select 1 as b
 union select 2;

create temporary table C
 select 1 as c
 union select 2
 union select 3;

select * from A
 left join B on a.a=b.b
 left join C on a.a=c.c;

select * from A
 left join B on a.a=b.b
 left join C on b.b=c.c;

select * from
 (select * from A left join B on a.a=b.b) ab
 left join C on ab.b=c.c;

leejin_521
leejin_521   2014.12.10 11:25

第一个 的left join table3 c on a.xxx = c.xxx 表示:a有数据,那么c可能有数据
第二个 的left join table3 c on b.xxx = c.xxx 表示:b有数据,那么c可能有数据
这两个肯定不一样的

第三个你表述的有问题,ab.xxx是哪个表的 xxx???

worm860530
worm860530 我的理解是这3种查询,查出来的数据有可能都不一样
大约 3 年之前 回复
worm860530
worm860530 第三个的情况大概就是ab表现查,查出来作为一个集合,再跟c表关联,c表中的xxx字段跟ab表中的某个字段有关联
大约 3 年之前 回复
fredrickhu
fredrickhu   Ds   Rxr 2014.12.11 08:39

这个一两句话是说不清楚的。建议你去看看 T-SQL技术内幕的相关内容 里面介绍得很清楚

你可以看看 LEFT JOIN的执行顺序。

blogtjf
blogtjf   2014.12.11 14:22

最终的结查是一样的, Left Join左表所有数都在,如果你把表的顺序改了,应该 就不一样了。你理解的没问题的。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!