左连接然后内连接不正确的结果使用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 |
请解释为什么它不起作用?
联接按其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
首先执行t
和tl
之间的left join
。这产生了一个新结果集(称为ttl
),其中包含来自t
和的行,可能包含从tl
或null
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
条款)改变了秩序的加入。我们现在第一是执行和t2
的inner join
之间tl
(可以称之为t2tl
)和然后执行t
和t2tl
之间left join
。这意味着left join
最后的行为,所以我们可以再次得到null
结果的最终结果。
要了解如何连接和on
条款的行为,认为join
字作为一个(
和on
条款为)
。然后,您会发现on
条款涉及的连接,因为找到匹配()
s。
谢谢你先生我纠正我的错误非常感谢 –
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)
是的,它的工作谢谢you.please解释为什么我的查询不正确,请吗?因为我在第二个表中使用内部所以第二个应该会来吗? –
因为,你有离开时加入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
它是我真实记录中的样本记录#table_link.temp_id =#temp2.id是错误的。这是两个不同的表格 –
是的,我用左为什么第二行不存在? –
同样的结果:(。 –