2012-08-29 26 views
1

得到一个组的多个值想象我有数据的表如下:逻辑HAVING子句中由结果

ROLE_ID | USER_ID | CODE 
--------------------------------- 
14  | USER A | 001 
15  | USER A | 002 
11  | USER B | 004 
13  | USER D | 005 
13  | USER A | 001 
15  | USER B | 009 
15  | USER D | 005 
12  | USER C | 004 
15  | USER C | 008 
13  | USER D | 007 
15  | USER D | 007 

我想要得到的用户ID和代码仅具有13个15 role_ids。因此,基于上述数据,我想回去以下

USER D | 005 
USER D | 007 

我有下面的查询,但是,它只能带回一个,不能同时使用。

SELECT a.user_id, a.code 
    FROM my_table a 
    WHERE a.ROLE_ID in (13,15,11,14) 
    group by a.USER_ID, a.code 
    having sum(case when a.role_id in (13,15) then 1 else 0 end) = 2 
    and sum(case when a.role_id in (11,14) then 1 else 0 end) = 0 
    ORDER BY USER_ID 

上面的查询不仅带来

USER D | 005 

而不是

USER D | 005 
USER D | 007 
+1

看起来它工作得很好:http://sqlfiddle.com/#!4/2b492/2/0 – EthanB

+0

不知道sqlfiddle。真棒网站。我给的例子是我的表的子集。因为,它的工作,我会尝试添加更多列在我的表中。 – Anthony

回答

2

有时候只是听自己的话的英文翻译成最简单的阅读SQL:

SELECT DISTINCT a.user_id, a.code 
    FROM my_table a 
    WHERE a.user_id in 
     (SELECT b.user_id 
     FROM my_table b 
     WHERE b.ROLE_ID = 13) 
    AND a.user_id in 
     (SELECT b.user_id 
     FROM my_table b 
     WHERE b.ROLE_ID = 15) 
    AND a.user_id NOT IN 
     (SELECT b.user_id 
     FROM my_table b 
     WHERE b.ROLE_ID NOT IN (13,15)) 
0

我会:

SELECT a.user_id, a.code 
FROM my_table a 
GROUP BY a.user_id, a.code 
HAVING sum(case when a.role_id in (13, 15) then 1 else 3 end) = 2 

:)

0
SELECT user_id, code FROM my_table 
WHERE role_id = 13 
INTERSECT 
SELECT user_id, code FROM my_table 
WHERE role_id = 15