create table #aa (InMainID int,price int)
create table #bb (InMainID int,OutMainID int,price int)
create table #cc (outMainID int)insert into #aa
select 1,10
union
select 2,20insert into #bb
select 1,1,50
select *
from #aa a
left join #bb b on a.inMainID=b.InMainID
inner join #cc c on b.OutMainID=c.OutMainID
where a.InMainID=1查詢結果:
無。以前我認為會有一條記錄。
現在也仍理解不了。
b和c先 inner join 。記錄為0
a再和結果做left 。那應該會有一條記錄啊?
為什麼會沒有查詢計劃分析裡看。也是b和c先連,再和a連希望得到指點。
謝謝!
解决方案 »
- sqlserver 一条SQL语句解决两种统计方式的问题
- 怎么我的sql 2000安装了 sp4补丁,版本号却是 8.00.194
- 符合条件1的取前10个或者符合条件2的取前2个,SELECT如何写
- 即将接触SQL的烦恼
- 关于sql server2000用户自定义函数使用的问题,简单,在线等待
- MS SQL SERVER2000中返回两个数据集的相交部分怎么写?
- 请邹大哥回答,书里的问题
- 在兩個表中尋找某個字段值不相同的SQL語句
- sql server 2005 远程还原数据库问题(我快哭了)
- HELP~~SQL Server存储进程一个小问题
- SQL中 查询与指定时间最相近的记录
- update 多表net ,c#
select *
from #aa a
left join #bb b on a.inMainID=b.InMainID --a 和b 先做left join ,有一行记录 inmainid = 1的
inner join #cc c on b.OutMainID=c.OutMainID --b 和c 再做inner join,c中无数据,所以出来就是没有一行满足
where a.InMainID=1
from #aa a
left join #bb b on a.inMainID=b.InMainID --先执行left join
inner join #cc c on b.OutMainID=c.OutMainID --上面步骤过滤出来的数据与c inner join
where a.InMainID=1 --这里过滤上面的所有结果
from #aa a
left join #bb b on a.inMainID=b.InMainID --a 和b 先做left join ,有一行记录 inmainid = 1的
inner join #cc c on b.OutMainID=c.OutMainID --b 和c 再做inner join,c中无数据,所以出来就是没有一行满足
where a.InMainID=1
(小F) 和 (【来者】) 說得很詳細。和結果能對得上。
但我還有二個疑問:
1 查看計劃: |--Nested Loops(Inner Join)
|--Hash Match(Inner Join, HASH:([c].[outMainID])=([b].[OutMainID]), RESIDUAL:([b].[OutMainID]=[c].[outMainID]))
| |--Table Scan(OBJECT:([tempdb].[dbo].[#cc_________________________________________________________________________________________________________________000000020BA9] AS [c]))
| |--Table Scan(OBJECT:([tempdb].[dbo].[#bb_________________________________________________________________________________________________________________000000020BA9] AS [b]), WHERE:([b].[InMainID]=1))
|--Table Scan(OBJECT:([tempdb].[dbo].[#aa_________________________________________________________________________________________________________________000000020BA9] AS [a]), WHERE:([a].[InMainID]=1))會發現,是b,c先處理,再處理 a2.處理順序怎麼判斷?謝謝大家
多表连接时,如果有一个连接是内连接,而其他连接是左连接或右连接,此时,以内连接为准.
你的查询改成这样才行:
select *
from #aa a
left join #bb b on a.inMainID=b.InMainID
left join #cc c on b.OutMainID=c.OutMainID
where a.InMainID=1
from #aa a
inner join #bb b on a.inMainID=b.InMainID
left join #cc c on b.OutMainID=c.OutMainID
where a.InMainID=1因为前两个用内连接可以获得结果.或者也可以说,表的连接是由连接表达式从前向后连接的,如果你这样:select *
from #aa a
left join #bb b on a.inMainID=b.InMainID
inner join #cc c on b.OutMainID=c.OutMainID
where a.InMainID=1则先左连接 aa ,bb ,由于它们有连接,因此有结果,所得连接结果与 cc 内连接,由于cc 没有记录,因此无满足连接条件的记录,所得结果也没有记录.