SQL - Используя CTE, я получаю Subquery вернул более чем 1 значение ошибки.Это не разрешено, когда подзапрос следует =,>, ... и т. Д. - PullRequest
1 голос
/ 24 июня 2019

В настоящее время у меня есть хранимая процедура, которая должна рассчитывать налог для разных сотрудников данной компании.

Чтобы уменьшить нагрузку на запрос и избежать проблем с тайм-аутом, я решил использовать 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 или более.Как мне достичь желаемой функциональности?

1 Ответ

0 голосов
/ 24 июня 2019

Это ваш 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],
        ...
 )
...