2014-02-11 123 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列都是主鍵,所以這不是一個問題。