2011-10-08 110 views
1

我有兩個表:連接兩個表中選擇

TABLE 1 
ID VALUE 
1 ABC 
2 DEF 
3 GHI 
4 JKL 
5 XYZ 

TABLE 2 
ID T1_ID VALUE 
1 1  A 
2 1  B 
3 2  A 
4 3  A 
5 3  B 
6 4  B 

我想選擇從表1中有一個表2一行值A和B. 所有行這將是行1和3 (不是2,因爲它只有A,而不是4,因爲它只有B)。 我可以在沒有子查詢的情況下執行此操作嗎?

(注:我還需要對查詢值如表1,所以我不能只是查詢表2)

+0

爲什麼你需要做它沒有一個子查詢? – GolezTrol

+0

子查詢性能可能很差,因爲表2非常​​龐大。 –

+0

沒有子查詢,你需要一個連接,這可能同樣糟糕。最好的想法是嘗試不同的解決方案並檢查性能。還取決於數據庫。 MySQL對於左連接非常好,而對於子選擇和「IN」過濾器則很糟糕,而在Oracle中則相反。你使用哪個數據庫? – GolezTrol

回答

3

Tadaaah!沒有子查詢。

select distinct 
    t1.* 
from 
    Table1 t1 
    inner join Table2 t2a on t2a.t1_ID = t1.ID and t2a.VALUE = 'A' 
    inner join Table2 t2b on t2b.t1_ID = t1.ID and t2b.VALUE = 'B' 
2
SELECT t1.ID, 
     t1.VALUE 
FROM Table1 t1 
     JOIN Table2 t2 
     ON t1.ID = t2.T1_ID 
WHERE t2.VALUE IN ('A', 'B') 
GROUP BY t1.ID, 
      t1.VALUE 
HAVING COUNT(DISTINCT t2.VALUE) = 2 
+0

不同的解決方案。也許OP可以針對我的性能測試你的解決方案。不知道哪個更好。 – GolezTrol

+0

有了好的索引,我會認爲'JOIN'會更好。儘管不太容易擴展到任意數量的項目。也有助於瞭解RDBMS ... –

+0

由於查詢的複雜性,第一個答案更容易整合。 –