2014-02-05 93 views
0

我有2个表和:M关系表,例如:选择在:M关系表

 
tb_1 
----- 
id_1 
1 
2 
3 

tb_2 
----- 
id_2 
10 
11 
12 

tb_nm 
------- 
id_1 id_2 
1  10 
1  11 
2  10 
3  10 

我想仅选择具有在tb_nm行witg ID_2 = 10和20的ID_1。 。 换句话说......我的话,我想只返回ID_1 = 1,因为是已经ID_2 = 10和11

我想这是唯一:

SELECT 
    id_1 
FROM 
    tb_nm 
WHERE 
    id_2 = 10 
    AND id_2 = 11 

和它返回零行。

我也试过这样:

SELECT 
    id_1 
FROM 
    tb_nm 
WHERE 
    id_2 IN (10,11) 

,并返回所有的行... 任何建议?

回答

1

我喜欢使用聚合和having子句来处理这些问题。这是表达这些条件的一种非常灵活的方式。

对于你的具体情况:

select id_1 
from tb_nm 
group by id_1 
having sum(id_2 = 10) > 0 and 
     sum(id_2 = 11) > 0; 

having子句中每个条件的行计数的每个组id_1值,其中的条件之一为真中的数量。

如果你想添加另一个条件,这很容易。例如,如果在结果中不需要12,那只是另一个条件。计数与值的行数和检查,以确保有没有:

having sum(id_2 = 10) > 0 and 
     sum(id_2 = 11) > 0 and 
     sum(id_2 = 12) = 0; 
+0

完美....非常感谢...工程.... – giordanolima

0
SELECT tt.id_1 
FROM tb_nm tt 
WHERE tt.id_2 = 10 
AND EXISTS (
    SELECT * 
    FROM tb_nm ex 
    WHERE ex.id_1 = tt.id_1 
    AND ex.id_2 = 11 
    );