左连接然后内连接不正确的结果使用sql?

问题描述:

我有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

同样的结果:(。 –

联接按其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

谢谢你先生我纠正我的错误非常感谢 –

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结果。但是一旦你做了内连接,那条记录将被消除(内连接将在前两个表的结果上执行)。 –

试试这个:

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是错误的。这是两个不同的表格 –