在SQL Server中有条件地应用连接

时间:2016-07-11 10:53:08

标签: sql sql-server sql-server-2012 sql-server-2008-r2

我有一些记录集,但是现在我必须只选择这个集合中那些在两个表中都有Id的记录。

假设我有包含

的table1
Id  Name
----------
1   Name1
2   Name2

现在我只需要从表一中选择那些记录 在table2或table3中有id的

我试图在内部联接中应用或操作,如:

select * 
from table1 
inner join table2 on table2.id = table1.id or
inner join table3 on table3.id = table1.id.

有可能吗?解决这个问题的最佳方法是什么?实际上我也无法使用

if exist(select 1 from table2 where id=table1.id) then select from table1

有人可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

使用left join,然后检查至少有一个联接是否找到了关系

select t1.* 
from table1 t1 
left join table2 t2 on t2.id = t1.id 
left join table3 t3 on t3.id = t1.id
where t2.id is not null 
   or t3.is is not null

答案 1 :(得分:1)

我认为最有效的方法是在table2和table3上使用UNION并加入它:

SELECT t1.*
FROM table1 t1
INNER JOIN(SELECT id FROM Table2
           UNION
           SELECT id FROM Table3) s
 ON(t.id = s.id)

答案 2 :(得分:1)

我倾向于使用exists

select t1.*
from table1 t1
where exists (select 1 from table2 t2 where t2.id = t1.id) or
      exists (select 1 from table3 t3 where t3.id = t1.id) ;

在联接中使用exists(或in)的优势涉及重复的行。如果table2table3包含给定id的多行,则使用join的版本将在结果集中生成多行。

答案 3 :(得分:1)

或者,您也可以使用以下SQL:

cl