與空間數據搭配使用的常見查詢是近鄰查詢。 最接近的芳鄰查詢可用來尋找最接近特定空間對象的空間物件。 例如,網站的商店尋找器通常必須找到最接近客戶位置的商店位置。
近鄰查詢可以用各種不同的有效查詢格式撰寫,但若要讓最接近的芳鄰查詢使用空間索引,則必須使用下列語法。
語法
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行必須被篩選掉。
警告
如果型別的 SRID 不同,則採用 geography 或 geometry 數據類型做為自變數的方法會傳回 NULL 。
建議將新的空間索引鑲嵌用於近鄰查詢中使用的索引。 如需空間索引鑲嵌的詳細資訊,請參閱 空間資料 (SQL Server) 。
範例
下列程式代碼範例顯示可使用空間索引的近鄰查詢。 此範例會使用 資料庫中的Person.AddressAdventureWorks2012數據表。
USE AdventureWorks2012
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 數據行上建立空間索引,以查看最接近芳鄰查詢如何使用空間索引。 如需建立空間索引的詳細資訊,請參閱 建立、修改及卸除空間索引。
範例
下列程式代碼範例顯示無法使用空間索引的近鄰查詢。
USE AdventureWorks2012
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(),因此無法利用空間索引。