Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-使用CTEs I get子查询返回超过1个值的错误。当子查询后跟=,>,。。。等_Sql_Sql Server_Common Table Expression - Fatal编程技术网

SQL-使用CTEs I get子查询返回超过1个值的错误。当子查询后跟=,>,。。。等

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

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

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

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。请花点时间勾选复选标记以接受答案✔ 在它旁边。请在此处阅读有关此礼仪的更多信息: