where子句中的动态列

时间:2011-06-07 08:00:09

标签: tsql sql-server-2008

我正在尝试执行这样的查询:

SELECT Id,Name,Distance=dbo.CalculateDistance(Lat,Lon,@lat,@lon)
FROM Requests
WHERE Distance < 2
ORDER BY Distance DESC

错误说,没有距离列。 我尝试了一次,但它切断了查询性能

SELECT Id,Name,Distance=dbo.CalculateDistance(Lat,Lon,@lat,@lon)
FROM Requests
WHERE dbo.CalculateDistance(Lat,Lon,@lat,@lon) < 2
--ORDER BY Distance DESC

不进行第二次计算,如何实现上述查询? 最诚挚的问候 迈拉

1 个答案:

答案 0 :(得分:3)

我发现下面的链接建议您对其值进行嵌套选择和过滤;在这种情况下,标量计算只执行一次。

所以你应该可以做一些像

这样的事情
        SELECT Id, Name, Distance FROM (
        SELECT Id,Name,Distance=dbo.CalculateDistance(Lat,Lon,@lat,@lon)
        FROM Requests) derived 
        WHERE Distance < 2 
        ORDER BY Distance DESC 

我简要介绍了执行计划,标量计算只发生一次。但你当然应该检查指数的使用等。

我希望它能提供一些帮助。

Avoid Transact-SQL's Column Alias Limitations