最も近い近隣の空間データのクエリを実行する
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス Microsoft Fabric のSQL データベース
空間データで使用される一般的なクエリは、最も近い近隣クエリです。 最近隣クエリは、特定の空間オブジェクトに最も近い空間オブジェクトを検索するために使用されます。 たとえば、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 つにあり、
STDistance()
メソッドがWHERE
およびORDER BY
句でその列を使用する必要があります。TOP
句はPERCENT
ステートメントを含むことはできません。WHERE
句はSTDistance()
メソッドを含む必要があります。WHERE
句に複数の述語がある場合、STDistance()
メソッドを含む述語は、AND
結合で他の述語と接続する必要があります。STDistance()
メソッドは、WHERE
句のオプションの一部にすることはできません。ORDER BY
句の最初の式ではSTDistance()
メソッドを使用する必要があります。ORDER BY
句の最初のSTDistance()
式の並べ替え順序は、ASC
である必要があります。STDistance
がNULL
を返すすべての行は、フィルターで除外する必要があります。
警告
引数として 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
句がないため、空間インデックスを使用できません。