SQL Server:基于搜索另一个结果集从一个表中获取结果

时间:2018-10-16 20:53:53

标签: sql-server

我正在尝试创建一个搜索页面,该页面将允许用户根据分配的技能返回员工姓名列表,以便用户可以为新工作选择最合格的技术人员。

我们有一个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?

谢谢

1 个答案:

答案 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