我正在尝试创建一个搜索页面,该页面将允许用户根据分配的技能返回员工姓名列表,以便用户可以为新工作选择最合格的技术人员。
我们有一个mpEmployee
表,其中包含基本名称和联系信息:
EmployeeID FirstName LastName
1 Nathan G
3 Jay A
6 Dawn H
17 Dawn S
各种技能都有一个ID,并在单个记录的mpAssignedSkills
表中分配给每个员工。每个员工可以分配多种技能。
AssignedSkillID EmployeeID SkillID
11 17 16
18 17 14
12 17 29
13 17 25
14 1 16
15 1 29
16 1 25
用户需要能够选择一组SkillID,并且它应该返回具有当前分配的所有这些技能的员工列表。
我尝试使用INNER JOIN,HAVING,IN和GROUP BY进行了许多查询,但都没有碰到运气。问题似乎出在mpAssignedSkills表的结果中。如何为分配了多个SKillID(即16,29,25)的员工返回一组不同的employeeID?
谢谢
答案 0 :(得分:0)
根据将ID传递给查询的方式,您可以填充所选ID的表变量。
DECLARE @SelectedSkillIds TABLE
(
SkillId INT
)
然后要找到具有匹配技能的员工,您可以加入表变量:
SELECT e.EmployeeId
,e.FirstName
,e.LastName
FROM mpEmployee e
WHERE EXISTS (SELECT AssignedSkillId
FROM mpAssignedSkills as
INNER JOIN @SelectedSkillIds ssid ON ssid.SkillId = as.SkillId
WHERE as.EmployeeId = e.EmployeeId)
如果技能有限,则可以尝试以下方法:
SELECT e.EmployeeId
,e.FirstName
,e.LastName
FROM mpEmployee e
WHERE EXISTS (SELECT AssignedSkillId
FROM mpAssignedSkills as
WHERE as.EmployeeId = e.EmployeeId
AND as.SkillId IN (@SkillId1, @SkillId2, @SkillId3 /* etc.. /*
)
EDIT :如果您知道提供的技能数量,一种简单的方法是计算与搜索匹配的已分配技能数量:
DECLARE @SkillId1 INT = 16
DECLARE @SkillId2 INT = 14
DECLARE @SkillId3 INT = 29
DECLARE @TotalSkills INT = 3
SELECT DISTINCT eas.EmployeeId
FROM mpEmployee e
INNER JOIN mpAssignedSkills eas ON eas.EmployeeId = e.EmployeeId
WHERE eas.SkillId IN (@SkillId1, @SkillId2, @SkillId3)
GROUP BY eas.EmployeeId
HAVING COUNT(eas.SkillId) = @TotalSkills
工作示例:here