无法从Sql Server表中获取最近的纬度和经度

无法从Sql Server表中获取最近的纬度和经度,sql,sql-server,Sql,Sql Server,我想在最近的位置应用半径。SQL查询在HAVING子句之前工作。如果执行整个查询,则其给出的错误为: 无效的列名“dist” 我的Sql查询是: SELECT name, latitude, longitude, ( 3959 * acos( cos( radians(30.901) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(75.8573) ) + sin( radians(30.901) ) *

我想在最近的位置应用半径。SQL查询在HAVING子句之前工作。如果执行整个查询,则其给出的错误为:

无效的列名“dist”

我的Sql查询是:

SELECT name, latitude, longitude, ( 3959 * acos( cos( radians(30.901) ) * cos( radians( latitude ) ) * 
cos( radians( longitude ) - radians(75.8573) ) + sin( radians(30.901) ) * 
sin( radians( latitude ) ) ) ) AS dist
FROM res HAVING dist <= 25 ORDER BY dist ASC
我尝试了同样的问题。但这是成功的一半。如果我在没有子句的情况下执行,那么它将起作用。否则会给我一个错误:

无效的列名“dist”


使用子查询定义列,然后从中选择

看看这是否适合你

Select name, latitude, longitude, dist
From (
SELECT name, latitude, longitude, ( 3959 * acos( cos( radians(30.901) ) * cos( radians( latitude ) ) * 
cos( radians( longitude ) - radians(75.8573) ) + sin( radians(30.901) ) * 
sin( radians( latitude ) ) ) ) AS dist
FROM res ) A
 WHERE dist <= 25 ORDER BY dist ASC

具有用于分组数据的属性。用where代替

使用以下命令:

SELECT      *
FROM        (
                SELECT name, latitude, longitude, ( 3959 * acos( cos( radians(30.901) ) * cos( radians( latitude ) ) * 
                cos( radians( longitude ) - radians(75.8573) ) + sin( radians(30.901) ) * 
                sin( radians( latitude ) ) ) ) AS dist
                FROM res
            ) myResult 
WHERE myResult.dist <= 25 
ORDER BY myResult.dist ASC

Having用于过滤数据组。这里没有分组或任何集合。我猜想这就像将have更改为WHEREThat一样简单,并且不能对在同一子查询的select中创建的表达式进行过滤。你为什么期望这两种方法都能奏效?它们不是非常基本的SQL事实。@下划线\d您是什么意思?使用别名可以毫无问题地做到这一点。从sys.tables order by x中选择名称+'''.'作为x。order by不能是表达式,被别名的列不能是派生列没有任何限制。@SeanLange您正在排序。我说的是使用where或have进行过滤。@下划线\u d ahh是的,我说的是排序,因为这是重点,但是的,您必须在where子句中对其进行子查询,才能使用它。没有分组依据。这里的have不起作用。不起作用不是问题描述。为什么不呢?什么错误?我挂断了Having子句,但你不需要它。试一试。我试了很多次,但都有错误。现在用where-then替换了have