2013-06-29 4 views
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 

Я хочу, чтобы выбрать всех сотрудников с Java И PHP навыков. С моим образцом выше он должен вернутьсяPostgresSQL подзапросов отношение один ко многим Поиск

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

Как это сделать в PostgrSQL?

ответ

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 

Если в вашем пользовательском интерфейсе вы уже знаете skill_ids, которые вы, вероятно, сделать, так как у вас есть реф стол для него, то вам не нужно даже второго присоединиться к

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 

Выход :

 
| EMPLOYEE_ID | FIRST_NAME | LAST_NAME | 
---------------------------------------- 
|   1 |  Tim |  Smith | 

Вот SQLFiddle demo

+0

Вместо этого 'WHERE s.name IN ('PHP', 'Java')' Могу ли я использовать что-то вроде этого: to_tsvector (s.name) @@ to_tsquery ('PHP | Java ') ' –

+0

@nelsonjuan Вероятно. Но зачем это делать? Я предлагаю отказаться от использования имен навыков в запросах вообще и использовать их только в пользовательском интерфейсе (если это возможно в вашем приложении). – peterm

+0

@nelsonjuan Если ответ был полезен, рассмотрите ** [accept] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) ** его. – peterm

Смежные вопросы