2012-08-28 24 views
1

我有一個表在我的Oracle數據庫與數據存儲諸如內查詢單個表

ROLE_ID | USER_ID 
------------------ 
14  | USER A 
15  | USER A 
11  | USER B 
13  | USER A 
15  | USER B 
12  | USER C 
15  | USER C 

我想所有的USER_ID s爲基礎的例子有兩個13和15的ROLE_ID以上,我應該只能拿回USER_A

如果我寫了下面

select * from table where ROLE_ID in (13,15);查詢然後我得到其他用戶也是如此。

如何修改查詢,以便我只拿回USER A

回答

7

您正在尋找有...

select user_id 
    from my_table 
where role_id in (13,15) 
group by user_id. 
having count(distinct role_id) = 2 

你保證,通過使用不同的,如果有說的兩個用戶A的,你仍然可以得到一個地方有兩種role_id小號

+0

這很好用!謝謝!但是有沒有辦法有一個NOT IN條件呢?例如,基於上面的示例,如果我想要僅返回具有13,15但不具有14的ID的條件,那麼該怎麼辦?只是簡單地在(14)中添加'AND role_id'不起作用。 – Anthony

+0

我已經提出了一個單獨的問題。 http://stackoverflow.com/questions/12169409/inner-queries-on-a-single-table-with-in-and-not-in-conditions – Anthony

3

試試這個

SELECT USER_ID FROM table WHERE ROLE_ID=13 
     INTERSECT 
SELECT USER_ID FROM table WHERE ROLE_ID=15 
0

您可以用內做加盟:

SELECT DISTINCT t1.USER_ID 
FROM table t1 
JOIN table t2 
ON t2.USER_ID = t1.USER_ID 
AND t2.ROLE_ID=15 
WHERE t1.ROLE_ID=13 
0

我只會在HAVNIG子句中做到這一點:

select user_id 
from t 
group by user_id 
having max(case when role_id = 13 then 1 else 0 end) = 1 and 
     max(case when role_id = 15 then 1 else 0 end) = 1 

我發現HAVING子句中的措辭這些條件提供了最大的靈活性。您可以擁有「和」條件,或「條件」,將結果限制爲僅具有13和15的用戶,或使用相同基本構造的任何內容。