关于SQL多表联查的问题。有深度 求解

和永恒有關 2011-10-27 02:11:22

SELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
left join tHubControl hub
on dtu.DTUID=hub.DTUID and dtu.IsDel = 0 and hub.IsDel = 0

得出的结果如图:




SELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
left join tHubControl hub
on dtu.DTUID=hub.DTUID
where dtu.IsDel = 0 and hub.IsDel = 0


得出的结果如图:






两句唯一的不同就在于 “一”是on后面跟连接条件加and
“二”是on后面跟连接条件加where
结果却不同,但这不是绝对的,有的时候这两句执行后得到的结果相同。


问:为什么只把“on”改为“where”结果就不同了。为什么“on”后面的and没有限制住isdel=0

这两句效率哪个更快,求解!
...全文
1628 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
从这个帖子里,我强化了两点知识:
1. left join 是以左表为基准,取出左表的全部数据和右表相匹配的数据,没有则用null补齐。如果左表数据没有的话,但是又满足查询条件,那么左表结果会以 null 来补充。

2. inner join 是返回两个表中连接字段相等的记录!

3. on 是连接的条件,而 where 是查询条件。
闲来之得 2011-11-02
  • 打赏
  • 举报
回复

SELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
left join tHubControl hub
on dtu.DTUID=hub.DTUID and dtu.IsDel = 0 and hub.IsDel = 0

等同于

SELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
left join tHubControl hub
on (dtu.DTUID=hub.DTUID and dtu.IsDel = 0 and hub.IsDel = 0)

这样可以理解了吧
和永恒有關 2011-11-02
  • 打赏
  • 举报
回复
呵呵,共勉之
豆瓣的酱 2011-11-02
  • 打赏
  • 举报
回复
最近刚在疑惑on where 和on and...学习了,THK。。。
HumCheck 2011-10-29
  • 打赏
  • 举报
回复
路过、、。。
muxingrenlgm 2011-10-29
  • 打赏
  • 举报
回复
两者是不同
xiaoxiangqing 2011-10-29
  • 打赏
  • 举报
回复
第一个是左联接
第二个变为内联接了
和永恒有關 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 qianjin036a 的回复:]
引用 19 楼 yuandongze 的回复:
再问一下 下面这条语句
SQL codeSELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
left join tHubControl hub
on dtu.DTUID=hub.DTUID and dtu.IsDel = 0 an……
[/Quote]

结贴。

谢谢大家,结贴给分。
CSDN是个神奇的地方。10分钟就解决疑问啦。
灰常感谢
昵称被占用了 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 yuandongze 的回复:]
再问一下 下面这条语句
SQL codeSELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
left join tHubControl hub
on dtu.DTUID=hub.DTUID and dtu.IsDel = 0 and hub.IsDel = 0


on……
[/Quote]
无区别
写在where也是无区别
-晴天 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 yuandongze 的回复:]
再问一下 下面这条语句
SQL codeSELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
left join tHubControl hub
on dtu.DTUID=hub.DTUID and dtu.IsDel = 0 and hub.IsDel = 0


on……
[/Quote]
木有区别,它是个比较表达式,既然用的是相等比较,那么哪个在前哪个在后是没区别的.
-晴天 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qianjin036a 的回复:]
left join 时,连接条件与查询条件不能互换,否则查询数据集不同.
在作连接条件时,右表的条件不满足时,仍然连接(因为它是左连接),右表的字段设置为NULL.
在作查询条件时,右表的条件不满足时,不作为查询结果输出,因为它不满足查询条件,被过滤掉了.
[/Quote]
[Quote=引用 13 楼 qianjin036a 的回复:]
也就是说,作为连接条件时,不满足条件的记录未能连接,因此只有左表内容,而作为查询条件时,它连接了,但被查询条件把所查到的过滤掉了,因此左表的内容也不会被查出.
[/Quote]

楼层盖得太快了...
和永恒有關 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 qianjin036a 的回复:]
引用 15 楼 yuandongze 的回复:
意思是不是说
on后面写and是作为连接条件,isdel=0不成立。那么left Join则是取出左表的全部数据和右表相匹配的数据,没有则用null补齐。

而on后面写where
则是在where没执行前先查出的左表的全部和右表的部分。然后根据where条件筛选


对头!
[/Quote]


朋友在帮我看看19L的问题
和永恒有關 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 haiwer 的回复:]
16楼搞错

SELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
left join tHubControl hub
on dtu.DTUID=hub.DTUID
where dtu.IsDel = 0 and hub.IsDel = 0

======

S……
[/Quote]

我说刚才试了一下 为什么不一样呢·············
和永恒有關 2011-10-27
  • 打赏
  • 举报
回复
再问一下 下面这条语句
SQL codeSELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
left join tHubControl hub
on dtu.DTUID=hub.DTUID and dtu.IsDel = 0 and hub.IsDel = 0


on dtu.DTUID=hub.DTUID 和 hub.DTUID=dtu.DTUID 有区别吗?为什么
-晴天 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yuandongze 的回复:]
意思是不是说
on后面写and是作为连接条件,isdel=0不成立。那么left Join则是取出左表的全部数据和右表相匹配的数据,没有则用null补齐。

而on后面写where
则是在where没执行前先查出的左表的全部和右表的部分。然后根据where条件筛选
[/Quote]

对头!
昵称被占用了 2011-10-27
  • 打赏
  • 举报
回复
16楼搞错

SELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
left join tHubControl hub
on dtu.DTUID=hub.DTUID
where dtu.IsDel = 0 and hub.IsDel = 0

======

SELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
inner join tHubControl hub
on dtu.DTUID=hub.DTUID
where dtu.IsDel = 0 and hub.IsDel = 0
昵称被占用了 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ssp2009 的回复:]
SQL code
SELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
left join tHubControl hub
on dtu.DTUID=hub.DTUID and dtu.IsDel = 0 and hub.IsDel = 0
--等同于
SELECT Hub……
[/Quote]

SELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
left join tHubControl hub
on dtu.DTUID=hub.DTUID and dtu.IsDel = 0 and hub.IsDel = 0
--等同于
SELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
inner join tHubControl hub
on dtu.DTUID=hub.DTUID and dtu.IsDel = 0 and hub.IsDel = 0
和永恒有關 2011-10-27
  • 打赏
  • 举报
回复
意思是不是说
on后面写and是作为连接条件,isdel=0不成立。那么left Join则是取出左表的全部数据和右表相匹配的数据,没有则用null补齐。

而on后面写where
则是在where没执行前先查出的左表的全部和右表的部分。然后根据where条件筛选
快溜 2011-10-27
  • 打赏
  • 举报
回复
SELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
left join tHubControl hub
on dtu.DTUID=hub.DTUID and dtu.IsDel = 0 and hub.IsDel = 0
--等同于
SELECT HubID,FactoryID,dtu.DTUID,DeviceName,dtu.projectid,dtu.isdel
FROM tDTU dtu
left join (select * from tHubControl where IsDel=0 and IsDel) hub
on dtu.DTUID=hub.DTUID
-晴天 2011-10-27
  • 打赏
  • 举报
回复
也就是说,作为连接条件时,不满足条件的记录未能连接,因此只有左表内容,而作为查询条件时,它连接了,但被查询条件把所查到的过滤掉了,因此左表的内容也不会被查出.
加载更多回复(12)

22,210

社区成员

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

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