sql-server - 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 小提琴
解决方案
就像是:
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
推荐阅读
- laravel - 如何在laravel中使用外键获取数据并连接两个表
- vue.js - Vue2:我可以将可选(全局)过滤器传递给可重用组件吗?
- javascript - 在Javascript中将元素从一个对象部分复制到另一个对象
- javascript - 为什么这没有给我我期望的对象..它是 {1:2} 而是控制台给出 {a:2}
- python-3.x - 如何将函数映射到 Tensorflow 中的预批处理 ('BatchDataset') 张量
- java - MbedTLS AES 128 在 Java 中加密和解密
- angularjs - 是否有一种标准方法可以将额外的 html 插入到一次性案例的指令模板中?
- fullcalendar - 如何在 Fullcalendar v4 中使用上一个/下一个时段在时间线视图中设置自定义可见范围?
- c# - C# WPF MVVM | 添加未显示在列表中的新对象
- node.js - 如何检查我的 pod 身份是否适用于 node.js 应用程序?