我有映射表CandidatesSkills,其中包含候選人與其擁有的技能之間的映射。然后我有另一個表格JobRequirements來映射作業和該作業所需的技能。
如果候選人具備該作業所需的所有技能,則他可以申請該作業。候選人可以有額外的技能。鑒于CandiateID我想找到候選人可以申請的所有作業。
我認為這是 SQL 中的 Relational Division with Remainder。這里有
作業到所需技能的映射

根據資料集,下面的查詢應回傳 JobID 2,3 和 5
這里是我的 SQL(基于 Peter Larsson (PESO) 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 小提琴
uj5u.com熱心網友回復:
就像是:
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
uj5u.com熱心網友回復:
在這種情況下,您使用多個除數進行關系除法。換句話說,你將各組的JobRequirements 每各 JobID由CandidateSkills該候選人的。
在這種情況下,LEFT JOIN解決方案要簡單得多
DECLARE @CandidateID INT = 1;
SELECT jr.JobID
,Skills = COUNT(c.SkillID)
,Requirements = COUNT(*)
FROM dbo.JobRequirements AS jr
LEFT JOIN dbo.CandidatesSkills AS c ON c.SkillID = jr.SkillID
AND c.CandidateID = @CandidateID
GROUP BY jr.JobID
HAVING COUNT(*) = COUNT(c.SkillID);
這樣做是將候選人的技能與要求相結合。然后,我們簡單地計算了所有Requirements的JobID,并確保它等于匹配的數量。
另一種寫法是
HAVING COUNT(CASE WHEN c.SkillID IS NULL THEN 1 END) = 0;
換句話說:不匹配的數量應該為零。
SQL小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/353308.html
標籤:sql-server 查询语句 sql-server-2012 sql-server-2016 关系划分
