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],
...
)
我目前有一个存储过程需要为给定公司的不同员工计算税收。
为了减少查询负载并避免超时问题的发生,我决定使用 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],
...
)