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 のスキルを持つすべての従業員を選択したいと考えています。上記の私のサンプルでは、​​それが返されるはずです

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テーブルがあるため、2番目の結合さえ必要ありません

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 | ティム | スミス |

これがSQLFiddleのデモです

于 2013-06-29T19:08:08.403 に答える