最简单的SQL查询用于简单的表设计

时间:2013-06-09 21:39:41

标签: sql database oracle

我正在努力想出最优的查询来解决这个问题。

我有一个简单的表,由列名(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和组织。

有什么想法吗?

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

An SQLfiddle to test with

编辑:An Oracle SQLfiddle with the same query

答案 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
                      )