1

我正在尝试提出最优化的查询来解决这个问题。

我有一个由列名称(字符串)和组织 ID(整数)组成的简单表。此表包含属于一个或多个组织的名称列表。

如何获取属于“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 和 5。

有任何想法吗?

4

2 回答 2

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

一个用于测试的 SQLfiddle

编辑:具有相同查询的 Oracle SQLfiddle

于 2013-06-09T21:52:09.740 回答
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
                      )
于 2013-06-09T22:06:55.050 回答