適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft 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 つにあり、
STDistance()メソッドがWHEREおよびORDER BY句でその列を使用する必要があります。TOP句はPERCENTステートメントを含むことはできません。WHERE句はSTDistance()メソッドを含む必要があります。WHERE句に複数の述語がある場合、STDistance()メソッドを含む述語は、AND結合で他の述語と接続する必要があります。STDistance()メソッドは、WHERE句のオプションの一部にすることはできません。ORDER BY句の最初の式ではSTDistance()メソッドを使用する必要があります。STDistance()句の最初のORDER BY式の並べ替え順序は、ASCである必要があります。STDistanceがNULLを返すすべての行は、フィルターで除外する必要があります。
Warning
引数として geography または geometry データ型を受け取るメソッドは、SRID が型に対して同じでない場合に NULL を返します。
新しい空間インデックス テセレーションは、最も近い近隣クエリで使用されるインデックスに使用することをお勧めします。 空間インデックス テセレーションの詳細については、「 空間データ」を参照してください。
例 1
次のコード例は、空間インデックスを使用できる最も近い近隣クエリを示しています。 この例では、 Person.Address サンプル データベースの AdventureWorks2025 テーブルを使用しています。
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);
このクエリは、構文で指定した形式の WHERE を使用する STDistance() 句がないため、空間インデックスを使用できません。