我很难解决如何使用HAVING
子句避免函数调用两次。
这是我的qry:
select col1, col2, dbo.someFunction(param1, param2) as col3
from...
where ...
group ...
having dbo.someFunction(param1, param2) > 0
如果我写了
having col3 > 0
服务器sais:Invalid column name 'col3 '.
有没有办法在显示的情况下使用HAVING
而不调用函数dbo.someFunction两次?
修改
我的执行计划包括:
没有(评论):
在选择中选择不带功能:
答案 0 :(得分:2)
你确定它是两次打电话吗?
我从以下两个查询中获得相同的执行计划
select enumID
from docSVenum1
group by enumID
having COUNT(*) > 2000
select enumID, count(*) as ccount
from docSVenum1
group by enumID
having COUNT(*) > 2000
答案 1 :(得分:0)
为了不调用该函数两次但引用列col3
中返回的结果,您将需要围绕查询的另一个SELECT语句,如下所示。
SELECT col1,
col2,
col3
FROM
(SELECT col1,
col2,
dbo.someFunction(param1, param2) AS col3
FROM ...
WHERE... ) AS Result
GROUP BY ...
HAVING col3 > 0
您无法在同一"嵌套级别"上通过别名引用列。对于SELECT,这就是为什么你必须在另一个SELECT语句中包含初始结果的原因,你可以通过它的别名引用该列。