+ -
当前位置:首页 → 问答吧 → 怪:SQL理解問題:多表聯接。

怪:SQL理解問題:多表聯接。

时间:2011-12-07

来源:互联网

SQL code

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,20

insert 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連

希望得到指點。
謝謝!


作者: MasterLonely   发布时间: 2011-12-07

一个0记录的表,与另一个非零记录的表进行左连接,怎么能查得出东西来呢!
左连接是,取左表的记录,及右表匹配的记录.

作者: qianjin036a   发布时间: 2011-12-07

没有记录

作者: ssp2009   发布时间: 2011-12-07

SQL code
select * 
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  --这里过滤上面的所有结果



作者: fredrickhu   发布时间: 2011-12-07

SQL code
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

作者: OrchidCat   发布时间: 2011-12-07

謝謝大家。
(小F) 和 (【来者】) 說得很詳細。和結果能對得上。
但我還有二個疑問:
1 查看計劃:
SQL code

  |--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先處理,再處理 a

2.處理順序怎麼判斷?

謝謝大家

作者: MasterLonely   发布时间: 2011-12-07

引用 2 楼 qianjin036a 的回复:
一个0记录的表,与另一个非零记录的表进行左连接,怎么能查得出东西来呢!
左连接是,取左表的记录,及右表匹配的记录.

a是有記錄的

作者: MasterLonely   发布时间: 2011-12-07

自已顶一下

作者: MasterLonely   发布时间: 2011-12-08

热门下载

更多