2017-03-20 55 views
0

我有3個表左連接然後內連接不正確的結果使用sql?

drop table #temp; 
create table #temp(id int,name varchar(50)) 

insert into #temp values(1,'ABC'); 
insert into #temp values(2,'XYZ'); 
select * from #temp 

drop table #table_link; 
create table #table_link(id int,temp_id int,temp2_id int) 

insert into #table_link values(1,1,1); 
insert into #table_link values(2,1,2); 

select * from #table_link 

drop table #temp2; 
create table #temp2(id int,active_tag bit); 
insert into #temp2 values(1,0) 
insert into #temp2 values(2,1) 

我期望的結果是得到在#temp表和active_tag = 1 #table_link即所有行。

id | name | #temp2_id | 
1 | ABC | 2  | 
2 | XYZ | NULL  | 

我試着查詢

select * from #temp t 
left join #table_link tl on tl.temp_id=t.id 
inner join #temp2 t2 on t2.id=tl.temp2_id and t2.active_tag=1 

在此查詢我得到的只有ABC行only.I使用左連接,爲什麼XYZ行不get.Currently結果來了這樣

id | name | #temp2_id | 
1 | ABC | 2  | 

請解釋爲什麼它不起作用?

+0

是的,我用左爲什麼第二行不存在? –

+0

同樣的結果:(。 –

回答

1

聯接按其ON子句存在的順序「完成」。連接不僅僅是在表格之間 - 它們經常在來自其他連接的結果之間。所以:

select * from #temp t 
left join #table_link tl on tl.temp_id=t.id 
inner join #temp2 t2 on t2.id=tl.temp2_id and t2.active_tag=1 

首先執行ttl之間的left join。這產生了一個新結果集(稱爲ttl),其中包含來自t的行,可能包含從tlnull s(因爲其爲left join)的連接行。我們然後加入結果ttl)至t2,執行內部聯接。但是,我們知道ttl可能包含null,對於源自tl的列,因此inner join將失敗。

我們可以改爲寫的是:

select * from #temp t 
left join #table_link tl 
inner join #temp2 t2 
on t2.id=tl.temp2_id and t2.active_tag=1 
on tl.temp_id=t.id 

而且注意,我現在已經(通過移動on條款)改變了秩序的加入。我們現在第一是執行和t2inner join之間tl(可以稱之爲t2tl)和然後執行tt2tl之間left join。這意味着left join最後的行爲,所以我們可以再次得到null結果的最終結果。


要了解如何連接和on條款的行爲,認爲join字作爲一個(on條款爲)。然後,您會發現on條款涉及的連接,因爲找到匹配() s。

+0

謝謝你先生我糾正我的錯誤非常感謝 –

1
select t.id,t.Name,tl.temp2_id from #temp t 
left join #table_link tl on tl.temp_id=t.id 
AND EXISTS (SELECT 1 from #temp2 t2 WHERE t2.id=tl.temp2_id AND t2.active_tag=1) 
+0

是的,它的工作謝謝you.please解釋爲什麼我的查詢不正確,請嗎?因爲我在第二個表中使用內部所以第二個應該會來嗎? –

+0

因爲,你有離開時加入XYZ結果。但是一旦你做了內連接,那條記錄將被消除(內連接將在前兩個表的結果上執行)。 –

0

試試這個:

SELECT * 
FROM #temp 
LEFT JOIN #table_link ON #table_link.id = #temp.id 
LEFT JOIN #temp2 ON #table_link.temp_id = #temp2.id 

您將獲得所需的輸出。您的查詢中的問題可能是因爲加入#temp2在以下內容: t2.id=tl.temp2_id

+0

它是我真實記錄中的樣本記錄#table_link.temp_id =#temp2.​​id是錯誤的。這是兩個不同的表格 –