0
employee_id | first_name | last_name
--------------------------------------
00001         Tim          Smith
00002         John         Doe

employee_id | skill_id
--------------------------------------
00001         1
00001         2
00002         1
00002         3

skill_id | name
--------------------------------------
1          Java
2          PHP
3          MySQL

我想选择所有具有 JavaPHP 技能的员工。上面我的示例应该返回

employee_id | first_name | last_name
--------------------------------------
00001         Tim          Smith

我怎样才能在 PostgreSQL 中做到这一点?

4

1 回答 1

1

尝试

SELECT e.employee_id, e.first_name, e.last_name
  FROM employee e JOIN employee_skills es
    ON es.employee_id = e.employee_id JOIN skills s
    ON es.skill_id = s.skill_id
 WHERE s.name IN('PHP', 'Java')
 GROUP BY e.employee_id, e.first_name, e.last_name
HAVING COUNT(DISTINCT s.skill_id) = 2

如果在你的 UI 中你已经知道你可能知道的 Skill_ids,因为你有它的 ref 表,那么你甚至不需要第二次加入

SELECT e.employee_id, e.first_name, e.last_name
  FROM employee e JOIN employee_skills es
    ON es.employee_id = e.employee_id 
 WHERE es.skill_id IN(1, 2)
 GROUP BY e.employee_id, e.first_name, e.last_name
HAVING COUNT(DISTINCT es.skill_id) = 2

输出:

| 员工 ID | FIRST_NAME | LAST_NAME |
--------------------------------------
| 1 | 蒂姆 | 史密斯 |

这是SQLFiddle演示

于 2013-06-29T19:08:08.403 回答