Oracle SQL - 查找包含另一组

时间:2015-11-09 09:15:31

标签: sql oracle

假设我有一张表A,其中包含潜在员工ID的清单及其技能代码形式的专业技能:

ID  | skill code
005   12
005   3
007   42
007   8
013   6
013   22
013   18

我还有另一张表B,其中列出了几个工作职位ID及其相应的所需技能ID:

Job ID | skill code
1        3
1        32
1        21
1        44
2        15
2        62
.
.
.

如何找出特定人员有资格获得的工作ID?我需要选择包含所有人技能的所有工作ID。比方说,我需要找到员工ID 003符合条件的所有工作ID,如何构建Oracle SQL查询以获取此信息?

我希望能够在WHERE子句中输入任何员工ID,以查找该人员有资格获得的工作。

2 个答案:

答案 0 :(得分:1)

一个想法是计算每个人和工作的技能数量:

SELECT A.id as person_id,
       B.JOB_ID
FROM A
JOIN B
ON A.skill_code=B.skill_code
GROUP BY a.id, b.job_id
HAVING count(*) = (select count(*) from a a2 where a2.job_id = b.job_id);

未经测试并假设表格已正常化。

在OP的comment之后更新。 要求所有需要一个人所有技能的工作:

WHERE a.id = :emp_id

Update2 :问题已更新为:

  

我希望能够在WHERE子句中输入任何员工ID,以查找该人员有资格获得的工作。

为此,您只需将FBSDKSharePhoto添加到第一个查询即可。 (上面分组)

答案 1 :(得分:0)

试试这个

WITH b1 AS
  (SELECT job_id,
    skill,
    COUNT(*) over (partition BY job_id order by job_id) rr
  FROM b
  ) ,
  res1 AS
  (SELECT a.id,
    b1.job_id,
    rr,
    COUNT(*) over (partition BY id, job_id order by id) rr2
  FROM A
  JOIN B1
  ON A.skill=B1.skill
  )
SELECT id, job_id FROM res1 WHERE rr=rr2