В настоящее время у меня есть хранимая процедура, которая должна рассчитывать налог для разных сотрудников данной компании.
Чтобы уменьшить нагрузку на запрос и избежать проблем с тайм-аутом, я решил использовать CTEдля расчета подоходного налога на одного работника данной компании.Подоходный налог используется в качестве основы для многих других расчетов, и я хотел бы избежать расчета снова и снова.
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 для каждого сотрудника )
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],
...
)
Таблица должна принести результат
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 значения.Это недопустимо, когда подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.
Код работает нормально, когда в компании 1сотрудник, но всегда разрывается с 2 или более.Как мне достичь желаемой функциональности?