首页 新闻 会员 周边

sql server中left join左链接遇到的问题。

0
悬赏园豆:10 [已解决问题] 解决于 2017-01-11 11:57

语句1 select a.* from a left join b on a.id=b.id 结果470条

语句2 select a.* from a left join b on a.id=b.id and a.Name='张三' 结果445条

语句3 select a.* from a left join b on a.id=b.id where a.Name='张三' 结果1条

语句4 select a.* from a left join b on a.Name='张三' 结果603条

 

语句2中查出来的数据有部分的name不等于'张三'

语句2为什么会查出不等于张三的数据?原因是什么?为什么语句4会查出来601条?它默认关联的字段又是那个呢?

问题补充:

我换了数据准确的几张表来做实验所以更改了一些数字,

a表id 唯一 name不重名 可能为空

b表id不唯一

子明的主页 子明 | 初学一级 | 园豆:109
提问于:2017-01-09 17:11
< >
分享
最佳答案
0

第二句,是以on a.id=b.id and a.Name='张三'作为关联关系,拼接数据;结果是能拼接的数据+未匹配上的数据(因为用的left,会将a表所有数据显示出来)

第四句,会查询出a中的是“张三”的数据,和b中的所有数据拼接,然后在加上a中所有不是“张三的数据”

 

 

 

收获园豆:8
登顶 | 初学一级 |园豆:52 | 2017-01-09 18:10

语句2 a表b表中存在id相等,且name='张三'的数据。

这种时候已经符合了匹配条件才对啊,为什么会返回a表本身呢?

 

语句4,a中张三的数据只有一条,而且在b表中也只有一条,返回的数量是两表总量+1.

子明 | 园豆:109 (初学一级) | 2017-01-09 18:19

@子明: 语句2是因为用的left,name='张三'只是a、b表拼接条件,并不是最后的过滤条件

语句4,:a中的“张三”*b + a剩余所有数据

登顶 | 园豆:52 (初学一级) | 2017-01-09 18:26

@子明: 语句2,用join是你想要得

登顶 | 园豆:52 (初学一级) | 2017-01-09 18:27

你回答的很有问题,但感觉你已经很认真的回答的样子就给你了。。

子明 | 园豆:109 (初学一级) | 2017-01-11 12:04
其他回答(5)
0

2和3的查询时等价的,你仔细检查你的查询结果,

4,笛卡尔乘积,你在on子句中写上 1=1 也行

 

悦光阴 | 园豆:2251 (老鸟四级) | 2017-01-09 17:58

23不等价,我可以确定以及肯定。内链接才会等价,我之所以贴出3是因为了说明3才是我想要的,凸显2为什么会查处来的数据不对

支持(0) 反对(0) 子明 | 园豆:109 (初学一级) | 2017-01-09 18:05

3是笛卡尔积后,重新使用where查询。如果使用的是join(内连接),才是相同的

支持(0) 反对(0) 登顶 | 园豆:52 (初学一级) | 2017-01-09 18:13

@子明: 哦,看错,2,3 不等价,

2:left join 左侧的a表数据必须全部保留,至于and a.name='张三',你可以认为'张三'=b.name,那意思你就明白了

3:where是最后一个filter,对查询结果进行过滤

支持(0) 反对(0) 悦光阴 | 园豆:2251 (老鸟四级) | 2017-01-09 18:16
0

我的理解:语句2的and,只有符合才会去关联b表,不符合的只返回a表本身。

收获园豆:1
让我发会呆 | 园豆:2929 (老鸟四级) | 2017-01-09 18:05

返回的数据是a表本身,为什么呢?之前的删掉干嘛,本来还想着回复你的

支持(0) 反对(0) 子明 | 园豆:109 (初学一级) | 2017-01-09 18:07

@子明: left join 就是以左表为基础的,a表的数据会全部显示,

你的a表对b表是一对多的关系吧,a表和b表id字段相同,则a就会多出一些相同id的数据,这是a.id=b.id的作用

语句2呢,a.id=b.id and a.Name='张三'  你把它看作整个关联条件。

通俗点讲,语句1显示的是a表的数据和a.id=b.id关联部分的数据

                 语句2显示的是a表的数据和a.id=b.id and a.Name='张三' 关联部分的数据

支持(0) 反对(0) 让我发会呆 | 园豆:2929 (老鸟四级) | 2017-01-10 08:47
0

个人建议:表连接就是表连接,搜索条件就是搜索条件。如果都这么写,那还要where子句干嘛?搜索条件还是写在where子句里面合适,你这种写法,就算知道了出错原因,也没有什么实际价值。

就事论事,不喜勿喷

 

龙葛格 | 园豆:782 (小虾三级) | 2017-01-09 19:38
0

 我刚试了一下,你说的没错,确实有这些问题。

你用left join为左连接查询,它以a表为主,查询a表和b表相等的部分和b表没有a表相等的就与null填充,查出来的时候a表有几条就显示几条(这就是语句2出现问题的结果),最后跟本就删选不出想得到的数据而where正好过滤了这些用null来显示的数据。

(个人理解,希望对你有所启发)

收获园豆:1
角色互换 | 园豆:187 (初学一级) | 2017-01-09 20:13
0

执行一边,看一下执行计划就知道怎么回事



xj_hao123 | 园豆:206 (菜鸟二级) | 2017-01-10 01:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册