共用方式為


查詢最接近鄰的空間數據

適用於: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 中, TOPORDER BY 子句可用來對空間數據行執行最接近的鄰近查詢。 子 ORDER BY 句包含空間數據行數據類型之 STDistance() 方法的呼叫。 子 TOP 句會指出要傳回查詢的物件數目。

必須符合下列需求,最接近的鄰近查詢才能使用空間索引:

  1. 空間索引必須存在於其中一個空間數據行上,而且 STDistance() 方法必須在 和 ORDER BY 子句中使用WHERE該數據行。

  2. TOP 句不能包含 PERCENT 語句。

  3. WHERE 句必須包含 STDistance() 方法。

  4. 如果 子句中有多個述詞,則包含STDistance()方法的WHERE述詞必須透過AND結合與其他述詞連接。 方法 STDistance() 不能在 子句的 WHERE 選擇性部分中。

  5. 子句中的 ORDER BY 第一個表達式必須使用 STDistance() 方法。

  6. 子句中第一個 STDistance() 表示式的 ORDER BY 排序順序必須是 ASC

  7. 傳回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() ,因此查詢無法使用空間索引。