适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 分析终结点
Microsoft Fabric 中的仓库
Microsoft Fabric 预览版中的 SQL 数据库
与空间数据一起使用的常见查询是最近的邻居查询。 最近的邻居查询用于查找与特定空间对象最近的空间对象。 例如,网站的商店定位符通常必须找到离客户位置最近的商店位置。
最近的邻居查询可以采用各种有效的查询格式编写,但对于最接近的邻居查询,必须使用以下语法。
Syntax
SELECT TOP ( number )
[ WITH TIES ]
[ * | expression ]
[, ...]
FROM spatial_table_reference, ...
[ WITH
(
[ INDEX ( index_ref ) ]
[ , SPATIAL_WINDOW_MAX_CELLS = <value>]
[ ,... ]
)
]
WHERE
column_ref.STDistance ( @spatial_ object )
{
[ IS NOT NULL ] | [ < const ] | [ > const ]
| [ <= const ] | [ >= const ] | [ <> const ] ]
}
[ AND { other_predicate } ]
}
ORDER BY column_ref.STDistance ( @spatial_ object ) [ ,...n ]
[ ; ]
最近的邻居查询和空间索引
在 SQL Server 中, TOP 子 ORDER BY 句用于对空间数据列执行最近的邻居查询。 对于空间列数据类型,ORDER BY 子句包含对 STDistance() 方法的调用。
TOP 子句指示针对该查询要返回的对象数。
若要使用空间索引,必须满足最接近的邻居查询的以下要求:
空间索引必须存在于其中一个空间列上,并且
STDistance()方法必须在WHERE和ORDER BY子句中使用该空间列。TOP子句不能包含PERCENT语句。WHERE子句必须包含STDistance()方法。如果
WHERE子句中有多个谓词,则必须使用STDistance()连词将包含AND方法的谓词连接到其他谓词。STDistance()方法不能是WHERE子句的可选部分。ORDER BY子句中的第一个表达式必须使用STDistance()方法。STDistance()子句中第一个ORDER BY表达式的排序顺序必须是ASC。必须筛选掉
STDistance返回NULL的所有行。
Warning
如果将地理或几何图形数据类型作为参数的方法,则对于这些类型而言,如果 SRID 不同,则返回NULL这些方法。
建议将新的空间索引分割用于最接近的邻居查询中使用的索引。 有关空间索引分割的详细信息,请参阅 空间数据。
Example 1
下面的代码示例演示了可以使用空间索引的最接近的邻居查询。 本示例使用 Person.Address 示例数据库中的 AdventureWorks2022 表。
USE AdventureWorks2022
GO
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
WHERE SpatialLocation.STDistance(@g) IS NOT NULL
ORDER BY SpatialLocation.STDistance(@g);
在 SpatialLocation 列上创建空间索引,以查看最近的邻居查询如何使用空间索引。 有关创建空间索引的详细信息,请参阅 Create, Modify, and Drop Spatial Indexes。
Example 2
下面的代码示例演示了无法使用空间索引的最接近的邻居查询。
USE AdventureWorks2022
GO
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
ORDER BY SpatialLocation.STDistance(@g);
该查询缺少在语法部分中指定的窗体中使用 WHERE 的 STDistance() 子句,因此它无法使用空间索引。