SQL 带有变量的服务器 double case 语句效率低下
SQL Server double case statement with variables inefficiencies
这可能只是不知道要搜索什么的情况,所以这个方向的答案是完全可以接受的。我正在将数据推送到我的 SQL 服务器并有以下(模拟),它有效,但似乎效率很低。我最终宁愿消除我所有的变量。
--From PHP
declare @employeeid varchar(25) = '100971'
declare @reviewscore as tinyint = 52
declare @payclass as varchar(25) = 'salary management'
--/From PHP
declare @wagequartile as tinyint = (select quartile from activeemployees where EmployeeID= @employeeid)
declare @scorequartile as tinyint = (
select
case
when @reviewscore <= max1 then 1
when @reviewscore <= max2 then 2
when @reviewscore <= max3 then 3
else 4
end as ScoreQuartile
from ReviewScoreMatrix where PayClass=@payclass
)
select
case
when @scorequartile = 1 then ScoreQuartile1
when @scorequartile = 2 then ScoreQuartile2
when @scorequartile = 3 then ScoreQuartile3
else 4
end as PercentRaise
from RaisePercentMatrix
where WageQuartile = @wagequartile
我尝试使用 CTE 进行游戏,但无法完全弄清楚它是如何变得更好的。相关栏目:
with cte1 as (
select
case
when @reviewscore <= max1 then 1
when @reviewscore <= max2 then 2
when @reviewscore <= max3 then 3
else 4
end as [ScoreQuartile]
from ReviewScoreMatrix where PayClass=@payclass
)
select
case
when (select top 1 ScoreQuartile from cte1) = 1 then ScoreQuartile1
when (select top 1 ScoreQuartile from cte1) = 2 then ScoreQuartile2
when (select top 1 ScoreQuartile from cte1) = 3 then ScoreQuartile3
else 4
end as PercentRaise
from RaisePercentMatrix
where WageQuartile = @wagequartile
我觉得我在 CTE 方面走在正确的轨道上,但是从 cte1 嵌入 select 似乎是个错误。感谢任何帮助。
如果我传输正确,那么你的代码可以变成这样:
declare
@employeeid varchar(25) = '100971',
@reviewscore as tinyint = 52,
@payclass as varchar(25) = 'salary management';
select PercentRaise =
case
when @reviewScore <= rsm.max1 then rpm.ScoreQuartile1
when @reviewScore <= rsm.max2 then rpm.ScoreQuartile2
when @reviewScore <= rsm.max3 then rpm.ScoreQuartile3
else 4
end
from activeEmployees e
join raisePercentMatrix rpm on e.quartile = rpm.wageQuartile
left join reviewScoreMatrix rsm on rsm.payClass = @payclass
where e.EmployeeID = @employeeid;
但是如果在某处您有每个员工的 table 评价分数和 table 薪资分配,那么您可以查询所有员工:
select e.employeeId,
PercentRaise =
case
when rs.reviewScore <= rsm.max1 then rpm.ScoreQuartile1
when rs.reviewScore <= rsm.max2 then rpm.ScoreQuartile2
when rs.reviewScore <= rsm.max3 then rpm.ScoreQuartile3
else 4
end
from activeEmployees e
join reviewScores rs on e.employeeId = rs.employeeId
join payClassInfo pci on e.employeeId = pci.employeeId
join raisePercentMatrix rpm on e.quartile = rpm.wageQuartile
left join reviewScoreMatrix rsm on rsm.payClass = pci.payclass;
这可能只是不知道要搜索什么的情况,所以这个方向的答案是完全可以接受的。我正在将数据推送到我的 SQL 服务器并有以下(模拟),它有效,但似乎效率很低。我最终宁愿消除我所有的变量。
--From PHP
declare @employeeid varchar(25) = '100971'
declare @reviewscore as tinyint = 52
declare @payclass as varchar(25) = 'salary management'
--/From PHP
declare @wagequartile as tinyint = (select quartile from activeemployees where EmployeeID= @employeeid)
declare @scorequartile as tinyint = (
select
case
when @reviewscore <= max1 then 1
when @reviewscore <= max2 then 2
when @reviewscore <= max3 then 3
else 4
end as ScoreQuartile
from ReviewScoreMatrix where PayClass=@payclass
)
select
case
when @scorequartile = 1 then ScoreQuartile1
when @scorequartile = 2 then ScoreQuartile2
when @scorequartile = 3 then ScoreQuartile3
else 4
end as PercentRaise
from RaisePercentMatrix
where WageQuartile = @wagequartile
我尝试使用 CTE 进行游戏,但无法完全弄清楚它是如何变得更好的。相关栏目:
with cte1 as (
select
case
when @reviewscore <= max1 then 1
when @reviewscore <= max2 then 2
when @reviewscore <= max3 then 3
else 4
end as [ScoreQuartile]
from ReviewScoreMatrix where PayClass=@payclass
)
select
case
when (select top 1 ScoreQuartile from cte1) = 1 then ScoreQuartile1
when (select top 1 ScoreQuartile from cte1) = 2 then ScoreQuartile2
when (select top 1 ScoreQuartile from cte1) = 3 then ScoreQuartile3
else 4
end as PercentRaise
from RaisePercentMatrix
where WageQuartile = @wagequartile
我觉得我在 CTE 方面走在正确的轨道上,但是从 cte1 嵌入 select 似乎是个错误。感谢任何帮助。
如果我传输正确,那么你的代码可以变成这样:
declare
@employeeid varchar(25) = '100971',
@reviewscore as tinyint = 52,
@payclass as varchar(25) = 'salary management';
select PercentRaise =
case
when @reviewScore <= rsm.max1 then rpm.ScoreQuartile1
when @reviewScore <= rsm.max2 then rpm.ScoreQuartile2
when @reviewScore <= rsm.max3 then rpm.ScoreQuartile3
else 4
end
from activeEmployees e
join raisePercentMatrix rpm on e.quartile = rpm.wageQuartile
left join reviewScoreMatrix rsm on rsm.payClass = @payclass
where e.EmployeeID = @employeeid;
但是如果在某处您有每个员工的 table 评价分数和 table 薪资分配,那么您可以查询所有员工:
select e.employeeId,
PercentRaise =
case
when rs.reviewScore <= rsm.max1 then rpm.ScoreQuartile1
when rs.reviewScore <= rsm.max2 then rpm.ScoreQuartile2
when rs.reviewScore <= rsm.max3 then rpm.ScoreQuartile3
else 4
end
from activeEmployees e
join reviewScores rs on e.employeeId = rs.employeeId
join payClassInfo pci on e.employeeId = pci.employeeId
join raisePercentMatrix rpm on e.quartile = rpm.wageQuartile
left join reviewScoreMatrix rsm on rsm.payClass = pci.payclass;