查詢最接近鄰的空間數據
適用於:sql Server Azure SQL 資料庫 Azure SQL 受控執行個體 Microsoft Fabric SQL 資料庫中 Microsoft Fabric Microsoft 倉儲中的 SQL 分析端點
與空間數據搭配使用的常見查詢是最近的鄰近查詢。 最接近的鄰近查詢可用來尋找最接近特定空間對象的空間物件。 例如,網站的商店定位器通常必須找到最接近客戶位置的商店位置。
最接近的芳鄰查詢可以用各種有效的查詢格式撰寫,但若要讓最接近的芳鄰查詢使用空間索引,則必須使用下列語法。
語法
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()
方法必須在 和ORDER BY
子句中使用WHERE
該數據行。子
TOP
句不能包含PERCENT
語句。子
WHERE
句必須包含STDistance()
方法。如果 子句中有多個述詞,則包含
STDistance()
方法的WHERE
述詞必須透過AND
結合與其他述詞連接。 方法STDistance()
不能在 子句的WHERE
選擇性部分中。子句中的
ORDER BY
第一個表達式必須使用STDistance()
方法。子句中第一個
STDistance()
表示式的ORDER BY
排序順序必須是ASC
。傳回
NULL
的所有數據列STDistance
都必須篩選掉。
警告
如果型別的 SRID 不同,則採用 geography 或 geometry 數據類型做為自變數的方法將會傳回。 NULL
建議將新的空間索引鑲嵌用於最接近鄰近查詢中使用的索引。 如需空間索引鑲嵌的詳細資訊,請參閱 空間數據。
範例 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 數據行上建立空間索引,以查看最接近的鄰近查詢如何使用空間索引。 如需建立空間索引的詳細資訊,請參閱 建立、修改及卸除空間索引。
範例 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()
,因此查詢無法使用空間索引。