共用方式為


查詢最近鄰居的空間資料

與空間數據搭配使用的常見查詢是近鄰查詢。 最接近的芳鄰查詢可用來尋找最接近特定空間對象的空間物件。 例如,網站的商店尋找器通常必須找到最接近客戶位置的商店位置。

近鄰查詢可以用各種不同的有效查詢格式撰寫,但若要讓最接近的芳鄰查詢使用空間索引,則必須使用下列語法。

語法

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() 方法必須在 和 WHERE 子句中使用ORDER BY該數據行。

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

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

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

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

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

  7. 所有返回STDistanceNULL行必須被篩選掉。

警告

如果型別的 SRID 不同,則採用 geographygeometry 數據類型做為自變數的方法會傳回 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(),因此無法利用空間索引。

另請參閱

空間數據 (SQL Server)