Sql server 使用连接执行相交
在以下存储过程中,我希望根据特定条件筛选员工。Sql server 使用连接执行相交,sql-server,join,intersection,Sql Server,Join,Intersection,在以下存储过程中,我希望根据特定条件筛选员工。 员工将拥有一项主要技能和任意数量的次要技能 下面是技能表的模式 id => int EmpId => int TechnologyId => int isPrimarySkill => bit Proficiency => int 如何根据多个次要技能和主要技能获取员工, 它是空的 CREATE PROCEDURE [dbo].[USP_SearchEmployees] @Name varchar(40) = n
员工将拥有一项主要技能和任意数量的次要技能 下面是技能表的模式
id => int
EmpId => int
TechnologyId => int
isPrimarySkill => bit
Proficiency => int
如何根据多个次要技能和主要技能获取员工,
它是空的
CREATE PROCEDURE [dbo].[USP_SearchEmployees]
@Name varchar(40) = null,
@ManagerId int = null,
@EmployeeType int = null,
@Location int = null,
@ExpInMonths int = null,
@PrimarySkills int = null,
@PrimarySkillsProficiency int = null,
@SecondarySkills XML = null,
@AvailableAfter int = null
AS
DECLARE @TSecondarySkills TABLE (ID int)
BEGIN
BEGIN TRY
BEGIN TRANSACTION TransactionName
INSERT INTO @TSecondarySkills (ID)
SELECT ParamValues.ID.value('.','VARCHAR(20)')
FROM @SecondarySkills.nodes('/TSecondarySkills/id') as ParamValues(ID)
SELECT E.Id as EmpId,(E.FirstName +' '+ E.LastName) as EmpName from Employee E
LEFT JOIN EmployeeSkill ES ON ES.EmployeeId = E.Id
LEFT JOIN @TSecondarySkills TSS ON ES.TechnologyId = TSS.ID AND ES.IsPrimarySkill = 0
LEFT JOIN ResourceAllocation RA ON RA.EmployeeId = E.Id AND RA.EndDate >= GETDATE() AND RA.StartDate <= GETDATE()
Where
((@ManagerId IS NULL) OR (E.ManagerId = @ManagerId )) AND
((@Name IS NULL) OR (E.FirstName LIKE '%'+@Name+'%' OR E.LastName LIKE '%'+@Name+'%' OR (E.FirstName+' '+E.LastName LIKE '%'+@Name+'%' ))) AND
((@EmployeeType IS NULL) OR (E.EmployementTypeId = @EmployeeType )) AND
((@Location IS NULL) OR (E.LocationId = @Location )) AND
((@PrimarySkills IS NULL) OR (ES.IsPrimarySkill = 1 AND TechnologyId = @PrimarySkills )) AND
((@PrimarySkillsProficiency IS NULL) OR (ES.IsPrimarySkill = 1 AND ES.Proficiency = @PrimarySkillsProficiency )) AND
((@ExpInMonths IS NULL) OR (dbo.GetExpInMonthByEmpID(E.Id) >= @ExpInMonths)) AND
((@SecondarySkills IS NULL) OR (TSS.ID IS NOT NULL)) AND
((@AvailableAfter IS NULL AND RA.EndDate IS NULL) OR (DATEDIFF(day,GETDATE(),RA.EndDate) <= @AvailableAfter) OR (RA.EndDate IS NULL))
GROUP BY
E.FirstName,E.LastName, E.Id
COMMIT TRANSACTION TransactionName
END TRY
BEGIN CATCH
RollBack Transaction TransactionName
End Catch
END
创建过程[dbo]。[USP\u]
@名称varchar(40)=空,
@ManagerId int=null,
@EmployeeType int=null,
@位置int=null,
@ExpInMonths int=null,
@PrimarySkills int=null,
@PrimarySkillsProficiency int=null,
@SecondarySkills XML=null,
@在int=null之后可用
像
声明@TSecondarySkills表(ID int)
开始
开始尝试
开始事务TransactionName
插入@TSecondarySkills(ID)
选择ParamValues.ID.value('.','VARCHAR(20)')
从@SecondarySkills.nodes('/tsecondarykills/id')作为参数值(id)
从员工E中选择E.Id作为EmpId,(E.FirstName+“”+E.LastName)作为EmpName
在ES.EmployeeId=E.Id上左键加入EmployeeSkill ES
在ES.TechnologyId=TSS.ID和ES.IsPrimarySkill=0上左键加入@TSecondarySkills-TSS
在RA.EmployeeId=E.Id和RA.EndDate>=GETDATE()和RA.StartDate=@ExpInMonths)上左键加入ResourceAllocation RA
(@SecondarySkills为空)或(TSS.ID不为空))以及
(@AvailableAfter为NULL,RA.EndDate为NULL)或(DATEDIFF(day,GETDATE(),RA.EndDate)如果您提到在StackOverflow中从学校粘贴的TagScope中使用的RDBMS可能会很有用。我在SQL Server中很弱。表中有哪些数据,您希望得到什么结果?