空間データをクエリして最近傍を見つける

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウスMicrosoft Fabric の SQL データベース

空間データで使用される一般的なクエリは、最近傍クエリです。 最近隣クエリは、特定の空間オブジェクトに最も近い空間オブジェクトを検索するために使用されます。 たとえば、Web サイトのストア ロケーターは、多くの場合、顧客の現在地に最も近い店舗の場所を見つける必要があります。

最近隣クエリは、さまざまな有効なクエリ形式で記述できますが、最近隣クエリで空間インデックスを使用するには、次の構文を使用する必要があります。

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 句は、クエリで返されるオブジェクトの数を示します。

空間インデックスを使用して最近傍クエリを実行するには、以下の要件を満たす必要があります。

  1. 空間インデックスが空間列の 1 つにあり、STDistance() メソッドが WHERE および ORDER BY 句でその列を使用する必要があります。

  2. TOP句は PERCENT ステートメントを含むことはできません。

  3. WHERE 句は STDistance() メソッドを含む必要があります。

  4. WHERE 句に複数の述語がある場合、STDistance() メソッドを含む述語は、他の述語と AND 接続詞で結ばれていなければなりません。 STDistance() メソッドは、WHERE 句のオプションの一部にすることはできません。

  5. ORDER BY 句の最初の式では STDistance() メソッドを使用する必要があります。

  6. ORDER BY 句の最初の STDistance() 式の並べ替え順序は、ASC である必要があります。

  7. STDistance が NULL を返すすべての行は、フィルターで除外される必要があります。

Warning

引数として geography または geometry データ型を受け取るメソッドは、型の SRID が同一でない場合、NULL を返します。

最近傍クエリで使用されるインデックスには、新しい空間インデックス テセレーションを使用することをお勧めします。 空間インデックス テセレーションの詳細については、「 空間データ」を参照してください。

例 1

次のコード例は、空間インデックスを使用できる最近傍クエリを示しています。 この例では、AdventureWorks2025 サンプル データベースの Person.Address テーブルを使用しています。

Note

Azure SQL DatabaseやMicrosoft FabricのSQLデータベースでは、USE ステートメントは利用できません。 代わりに、意図したデータベースに直接接続し、残りのコードサンプルを実行してください。

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」を参照してください。

例 2

次のコード例は、空間インデックスを使用できない最近傍クエリを示しています。

Note

Azure SQL DatabaseやMicrosoft FabricのSQLデータベースでは、USE ステートメントは利用できません。 代わりに、意図したデータベースに直接接続し、残りのコードサンプルを実行してください。

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);  

このクエリには、構文セクションで指定されている形式で STDistance() を使用する WHERE 句がないため、空間インデックスを使用できません。