次の方法で共有


最も近い近隣の空間データのクエリを実行する

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance SQL analytics endpoint in Microsoft Fabric Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

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

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

構文

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. STDistanceNULL を返すすべての行は、フィルターで除外する必要があります。

警告

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

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

例 1

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

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

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

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 句がないため、空間インデックスを使用できません。