2011-10-08 104 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

由于查询的复杂性,第一个答案更容易整合。 –