2014-02-11 171 views
1

我所试图做的是拉的数据回来,如果在两个不同的表中存在的ID,所以例如:where(...)or in(...)clause?

select details from myTable 
where myTable.id in (select id from tbl1) or myTable.id in (select id from tbl2) 

到目前为止,我还没有任何运气。我是否正确地做这件事?如果不是,你们能否提出一些我可以得到预期结果的方法?

我遇到的问题是查询挂起,我不确定这是否是由于格式不正确的查询或其他原因导致的,我不知道。

+1

你有什么问题?查询不会返回您认为应该执行的数据,还是执行时挂起的数据或其他内容? – Onyxite

+0

如果它需要存在于两者中,您是否想过使用AND而不是OR?如果有其他事情,也许你可以告诉我们你的期望(样本数据和期望的结果是什么),或者“没有任何运气”的意思。 –

+0

@AaronBertrand不,所讨论的ID只需要存在于tbl1或tbl2中,所以我的'OR'在那个实例中是正确的。我遇到的问题是查询挂起,并且我不确定这是否是由于格式错误的查询或其他原因导致我没有想到。 – KidBatman

回答

2

尝试使用UNION:

SELECT details 
FROM dbo.myTable 
WHERE 
    myTable.id IN (SELECT id FROM dbo.tbl1 
        UNION 
        SELECT id FROM dbo.tbl2) 
1

如果你想检查是否两个表中存在,你可以这样做:

SELECT details 
FROM dbo.myTable A 
WHERE EXISTS ( SELECT 1 
       FROM dbo.tbl1 B 
       INNER JOIN dbo.tbl2 C 
        ON B.ID = C.ID 
       WHERE A.ID = B.ID) 
1

这从myTable的如果ID返回数据存在于TBL1或TBL2的任

SELECT details 
from myTable mt 
where exists (select id from tbl1 where id = mt.id) 
    or exists (select id from tbl2 where id = mt.id) 

对于大表,这将比基于联合的查询(假设合适的索引)更好,因为您只是检查是否存在,而不是从其他表中检索数据。

0

这里是你如何能做到这一点,只有加入,并没有子查询:

SELECT details FROM myTable 
LEFT JOIN tbl1 ON tbl1.id = myTable.id 
LEFT JOIN tbl2 ON tbl2.id = myTable.id 
WHERE tbl1.id IS NOT NULL OR tbl2.id IS NOT NULL 

如果仍然挂起或需要很长的时间,很可能没有这些id一列的索引。虽然,id通常是一个自动索引的主键,所以这是不太可能的。

我要补充的是,如果这些id列可以被复制,即大于在tbl1一个行具有相同的id,那么这将导致details重复副本。再次,我假设所有的id列都是主键,所以这不是一个问题。