2017-03-20 9 views
0

I 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) 

Iを有する結果であること#table_linkと#TEMPテーブルとactive_tag = 1のすべての行を取得所望。

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

私はクエリがXYZ行がget.Currently結果は、この

のように来ていない理由を私はABC行only.Iは、参加左慣れるこのクエリで

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 

で試してみました

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

なぜ機能しないのですか?

+0

はい私は左の2番目の行が存在しない理由を使用しますか? –

+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 

まずttlleft joinを実行します。これは生成tから行を含む新しい結果セット(ttlそれを呼び出すことができます)が(そのleft join以降)tl又はnull sから行を接合含有してもよいです。我々を次には(ttl)からt2の結果を得て、内側の結合を実行して、に参加します。しかしttlには、tlに由来する列のためにnullが含まれている可能性があります。したがって、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句を動かすことで)今きたことに注意してため加入のを変更:

は、私たちが代わりに書くことができることです。私たちは、tt2tlleft joinを行っinner join、その後tl間とt2t2tlそれを呼び出すことができます)とを行い、今最初です。これは、最後にnullの結果を得ることができるので、left joinが最後に動作することを意味します。


合流しon句の行為、)あるとして(on句としてjoin単語をどのように考えるかを確認します。次に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

ありがとうございます。なぜ私のクエリが正しくないのか説明してください。2番目のテーブルで内側を使用したので、2番目のテーブルが正しく来るはずですか? –

+0

ジョインを放置したときのXYZ結果です。しかし、Innerを実行するとすぐにそのレコードは削除されます(ここでの内部結合は最初の2つのテーブルの結果で実行されます)。 –

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は間違っています。それは2つの異なるテーブルです –

関連する問題