我正在努力想出最优的查询来解决这个问题。
我有一个简单的表,由列名(string)和organization_id(int)组成。此表包含属于一个或多个组织的名称列表。
如何获得属于“Jim”和“Andy”所属组织的所有名称的列表?
示例:
- John,1
- Jim,1
- Jim,2
- Andy,2
- Carl,2
- Jim,3
- Carl,3
- Andy,4
- John,4
- Jim,5
- Randy,5
- Andy,5
所以查询应该返回给我Jim,2|Andy,2|Carl,2|Jim,5|Randy,5|Andy,5
,因为Jim和Andy都属于组织2和组织。
有什么想法吗?
答案 0 :(得分:2)
直接JOIN
应该这样做;
SELECT DISTINCT t1.name
FROM Table1 t1
JOIN Table1 t2 ON t1.organization_id = t2.organization_id AND t2.name = 'Jim'
JOIN Table1 t3 ON t1.organization_id = t3.organization_id AND t3.name = 'Andy'
ORDER BY t1.name
答案 1 :(得分:1)
为了获得“Jim”和“Andy”所属的组织,我喜欢使用聚合:
select organization
from t
group by organization
having sum(case when name = 'Jim' then 1 else 0 end) > 0 and
sum(case when name = 'Andy' then 1 else 0 end) > 0
然后,您可以使用以下方式获取这些组织中的所有人员:
select *
from t
where organization in (select organization
from t
group by organization
having sum(case when name = 'Jim' then 1 else 0 end) > 0 and
sum(case when name = 'Andy' then 1 else 0 end) > 0
)