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;