我有两个T-SQL标量函数,这两个执行计算对数据的大量资金(以时间"很多"),并返回一个值,例如CalculateAllIncomes(雇员)和CalculateAllExpenditures(雇员).
我运行一个select语句来调用这些并返回每个Employee的结果.我还需要为AllIncomes-AllExpenditures计算每个员工的平衡.
我有一个函数为getBalance(雇员)调用所述两个上述功能并返回结果{CalculateAllIncomes(EmployeeID) - CalculateAllExpenditures(EmployeeID)}.但如果我这样做:
Select CalculateAllIncomes(EmployeeID), CalculateAllExpenditures(EmployeeID), GetBalance(EmployeeID) .... 功能CalcualteAllIncomes()和CalculateAllExpenditures被调用两次(一次明确而一旦为getBalance funcion内),并因此产生的查询时间,只要它应该的两倍.
我想找一些更好的解决方案.我试过了:
select alculateAllIncomes(EmployeeID), AS Incomes, CalculateAllExpenditures
(EmployeeID) AS Expenditures, (Incomes - Expenditures) AS Balance....
Run Code Online (Sandbox Code Playgroud)
但它会引发错误:
无效的列名称收入和
列名支出无效.
我确信必须有一个简单的解决方案,但我无法弄明白.出于某种原因,似乎我不能在SELECT子句中使用列别名.是这样吗?如果是这样,在这种情况下可能有什么解决方法?谢谢你的任何建议.
忘记函数调用:您可以在一个普通查询中完成所有操作.
函数调用误用(尝试OO封装)会迫使您进入这种情况.此外,如果您在Employee表中每行都有GetBalance(EmployeeID),那么您正在对表进行CURSOR.而你现在也通过多次通话复合了这一点.
你需要的是这样的:
;WITH cSUMs AS
(
SELECT
SUM(CASE WHEN type = 'Incomes' THEN SomeValue ELSE 0 END) AS Income),
SUM(CASE WHEN type = 'Expenditures' THEN SomeValue ELSE 0 END) AS Expenditure)
FROM
MyTable
WHERE
EmployeeID = @empID --optional for all employees
GROUP BY
EmployeeID
)
SELECT
Income, Expenditure, Income - Expenditure
FROM
cSUMs
Run Code Online (Sandbox Code Playgroud)
通过从基于bog标准集的聚合查询中消除这种OO思想,我曾经从一个周末到一秒钟之内得到一个查询.
| 归档时间: |
|
| 查看次数: |
1336 次 |
| 最近记录: |