2014-02-05 94 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 
    );