SQL - 使用 CTE,我得到子查询返回超过 1 个值的错误。当子查询遵循 =、>、... 等时,这是不允许的

SQL - Using CTEs I get Subquery returned more than 1 value error. This is not permitted when subquery follows =, >,... etc

我目前有一个存储过程需要为给定公司的不同员工计算税收。

为了减少查询负载并避免超时问题的发生,我决定使用 CTE 来计算给定公司每位员工的所得税。所得税被用作许多其他计算的基础,我想避免一次又一次地计算。

WITH 
monthlyTaxCTE (EmployeeID, IncomeTax) AS 
(
SELECT tblEmployees.EmployeeID, -huge SELECT for Tax Calculation-
FROM tblEmployees
WHERE tblEmployees.companyid=@companyid
)

我希望下面的 table 给我下面的结果

EmployeeID | IncomeTax
----------   ---------
144            7000
145            4000

下面我使用另一个 CTE 和下面的代码 (GetEmployeeB2 如果函数根据 1.Year、2.EmployeeID - 进行额外计算以查找其他员工贡献、3.Income 税收 - 来自每位员工的 CTE)

tempCTE AS 
(
...,
tblEmployees.employeeid as [Employee_ID],
dbo.GetEmployeeB2(@Year, tblEmployees.EmployeeID, 
(SELECT IncomeTax FROM monthlyTaxCTE 
INNER JOIN tblEmployees ON monthlyTaxCTE.EmployeeID = tblEmployees.EmployeeID))
AS [Other Deductions],
...
)

table 应该会带来结果

EmployeeID | IncomeTax
----------   ---------
144            560
145            420

我尝试将 GetEmployeeB2 函数更改为:

dbo.GetEmployeeB2(@Year, tblEmployees.EmployeeID, 
(SELECT IncomeTax FROM monthlyTaxCTE WHERE tblEmployees.EmployeeID 
IN (SELECT EmployeeID FROM monthlyTaxCTE))

或者这个:

dbo.GetEmployeeB2(@Year, tblEmployees.EmployeeID, 
(SELECT IncomeTax AS mTaxValue FROM monthlyTaxCTE AS mTaxTable 
INNER JOIN tblEmployees ON mTaxTable.EmployeeID = tblEmployees.EmployeeID))

但给出的错误总是

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

当公司有 1 名员工时代码运行良好,但总是在 2 名或更多员工时出现问题。 我怎样才能实现我想要的功能?

这是您的 CTE:

tempCTE AS (
 select ...,
        tblEmployees.employeeid as [Employee_ID],
        dbo.GetEmployeeB2(@Year, tblEmployees.EmployeeID, 
        (SELECT IncomeTax
         FROM monthlyTaxCTE INNER JOIN
             tblEmployees
             ON monthlyTaxCTE.EmployeeID = tblEmployees.EmployeeID
        ) AS [Other Deductions],
        ...
 )

在子查询中重复 table 名称是高度可疑的。通常,人们只会使用相关子查询:

tempCTE AS (
 select ...,
        tblEmployees.employeeid as [Employee_ID],
        dbo.GetEmployeeB2(@Year, tblEmployees.EmployeeID, 
        (SELECT t.IncomeTax
         FROM monthlyTaxCTE t
         WHERE t.EmployeeID = tblEmployees.EmployeeID
        ) AS [Other Deductions],
        ...
 )