首页 > 解决方案 > TSQL:带余数的关系除法 (RDWR)

问题描述

我有一个映射表CandidatesSkills,其中包含候选人与他们所拥有的技能之间的映射。然后我有另一个表格JobRequirements,其中映射了工作和该工作所需的技能。
如果候选人具备该工作所需的所有技能,他就可以申请该工作。候选人可以拥有额外的技能。鉴于CandiateID我想找到候选人可以申请的所有工作。

我认为这是 SQL 中带余数的关系除法。这里有一篇文章 解释了确切的问题。(注意:本文试图找到所有具有给定工作的所有技能的候选人。我的问题正好相反。我试图找到与给定候选人的技能相匹配的所有工作)

候选人的技能
在此处输入图像描述

工作到所需技能的映射
在此处输入图像描述

根据数据集,下面的查询应该返回 JobID 2,3 和 5

这是我的 SQL(基于 Peter Larsson (PESO) Solution for RDNR/RDWR)

DECLARE @CandidateID INT = 1

SELECT JobID 
FROM        
(
    SELECT jr.JobID
        ,cnt=SUM(CASE WHEN jr.SkillID = c.SkillID THEN 1 ELSE 0 END)
        ,Items=COUNT(*)
    FROM dbo.JobRequirements AS jr
    CROSS JOIN dbo.CandidatesSkills  AS c    
    WHERE c.CandidateID = @CandidateID
    GROUP BY jr.JobID, jr.SkillID
) d
GROUP BY JobID
HAVING  SUM(cnt) = MIN(Items)
    AND MIN(cnt) >= 0;    

但是,查询不返回任何内容。试图找出我的查询有什么问题

这是SQL 小提琴

标签: sql-servertsqlsql-server-2012sql-server-2016relational-division

解决方案


就像是:

DECLARE @CandidateID INT = 1;

with cj as
(
  select cs.CandidateId, 
         jr.JobId, 
         count(*) over (partition by jr.JobId, cs.CandidateId) skillsPosessed,
         (select count(*) from JobRequirements where JobId = jr.JobId) skillsRequired
  from CandidatesSkills cs
  join JobRequirements jr
    on cs.SkillId = jr.SkillId
)
select distinct cj.CandidateId, cj.JobId
from cj
where cj.skillsPosessed = cj.skillsRequired

推荐阅读