SQL-使用CTEs I get子查询返回超过1个值的错误。当子查询后跟=,>,。。。等
我目前有一个存储过程,需要为给定公司的不同员工计算税款 为了减少查询的负载并避免超时问题的发生,我决定使用CTEs来计算给定公司每位员工的所得税。所得税被用作许多其他计算的基础,我希望避免反复计算SQL-使用CTEs I get子查询返回超过1个值的错误。当子查询后跟=,>,。。。等,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,我目前有一个存储过程,需要为给定公司的不同员工计算税款 为了减少查询的负载并避免超时问题的发生,我决定使用CTEs来计算给定公司每位员工的所得税。所得税被用作许多其他计算的基础,我希望避免反复计算 WITH monthlyTaxCTE (EmployeeID, IncomeTax) AS ( SELECT tblEmployees.EmployeeID, -huge SELECT for Tax Calculation- FROM tblEmployees WHERE tblEmployee
WITH
monthlyTaxCTE (EmployeeID, IncomeTax) AS
(
SELECT tblEmployees.EmployeeID, -huge SELECT for Tax Calculation-
FROM tblEmployees
WHERE tblEmployees.companyid=@companyid
)
我希望下表给出以下结果
EmployeeID | IncomeTax
---------- ---------
144 7000
145 4000
下面我正在使用另一个CTE,代码如下
GetEmployeeB2如果函数基于1.Year、2.EmployeeID进行额外计算-以便查找其他员工供款,3.所得税-来自每个员工的CTE
这张桌子应该有结果
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))
但给出的错误总是
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时
当公司有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],
...
)
在子查询中重复表名非常可疑。通常,只需使用相关子查询:
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:
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],
...
)
在子查询中重复表名非常可疑。通常,只需使用相关子查询:
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],
...
)
这里不清楚的是,子查询返回的行数不应超过1行,而您的子查询返回的行数不应超过1行。您是在告诉我CTEs不能返回超过1行的行数??执行普通联接而不是子查询。然后,传递给函数的每个值都将独立处理。更好的是,将函数内联表设置为值,然后您可以交叉应用于它……这和CTE无关。尝试选择名称,从sys.master_文件中选择物理_名称,其中database_id=d。database_id从sys.databases中选择为d;该子查询必须为每行返回一个值。除非您引入一个TOP、MAX或其他结构来过滤除一行以外的所有行。@KMarinis88我说的是您的子查询,而不是您的CTE。这里不清楚的是,子查询返回的行数不应该超过1行,而您的子查询返回的行数应该超过1行。您是说CTE返回的行数不能超过1行吗?请执行一个普通联接而不是子查询。然后,传递给函数的每个值都将独立处理。更好的是,将函数内联表设置为值,然后您可以交叉应用于它……这和CTE无关。尝试选择名称,从sys.master_文件中选择物理_名称,其中database_id=d。database_id从sys.databases中选择为d;该子查询必须为每行返回一个值。除非您引入一个TOP、MAX或其他结构来过滤除一行之外的所有行。@KMarinis88我说的是您的子查询,而不是CTE。谢谢。。不知何故,我有一些旧代码遗留下来的内部连接。现在很有魅力..你好@KMarinis88。请花点时间勾选复选标记以接受答案✔ 在它旁边。在这里阅读更多关于这种礼仪的信息:谢谢。。不知何故,我有一些旧代码遗留下来的内部连接。现在很有魅力..你好@KMarinis88。请花点时间勾选复选标记以接受答案✔ 在它旁边。请在此处阅读有关此礼仪的更多信息: