Megosztás a következőn keresztül:


Térbeli adatok lekérdezése a legközelebbi szomszédhoz

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

A térbeli adatokkal használt gyakori lekérdezés a legközelebbi szomszéd lekérdezés. A legközelebbi szomszéd lekérdezésekkel megkereshető egy adott térbeli objektum legközelebbi térbeli objektuma. Például egy webhely tárolókeresőjének gyakran meg kell találnia az ügyfél helyéhez legközelebbi tárolóhelyeket.

A legközelebbi szomszéd lekérdezések különböző érvényes lekérdezési formátumokban írhatók, de ahhoz, hogy a legközelebbi szomszéd lekérdezés térbeli indexet használjon, a következő szintaxist kell használni.

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 ]  
[ ; ]  

Legközelebbi szomszéd lekérdezés és térbeli indexek

Az SQL Serverben TOP és ORDER BY záradékok használatával hajthat végre legközelebbi szomszéd lekérdezést a térbeli adatoszlopokon. A ORDER BY záradék a térbeli oszlop adattípusának STDistance() metódusának hívását tartalmazza. A TOP záradék a lekérdezéshez visszaadandó objektumok számát jelzi.

A legközelebbi szomszéd lekérdezésnek a térbeli index használatához a következő követelményeknek kell megfelelnie:

  1. A térbeli indexnek szerepelnie kell az egyik térbeli oszlopon, és a STDistance() metódusnak ezt az oszlopot kell használnia a WHERE és ORDER BY záradékokban.

  2. A TOP záradék nem tartalmazhat PERCENT utasítást.

  3. A WHERE záradéknak tartalmaznia kell egy STDistance() metódust.

  4. Ha a WHERE záradékban több predikátum is szerepel, akkor a STDistance() metódust tartalmazó predikátumot AND kötőszóval kell csatlakoztatni a többi predikátumhoz. A STDistance() metódus nem szerepelhet a WHERE záradék opcionális részében.

  5. A ORDER BY záradék első kifejezésének a STDistance() metódust kell használnia.

  6. A STDistance() záradék első ORDER BY kifejezésének rendezési sorrendje ASC-nek kell lennie.

  7. Az összes sort, amelyeknél STDistanceNULL-et ad vissza, ki kell szűrni.

Warning

Az földrajzi vagy geometriát argumentumként adattípusokat használó metódusok NULL adnak vissza, ha az SRID-k nem azonosak a típusok esetében.

Javasoljuk, hogy az új térbeli index-tessellációkat a legközelebbi szomszéd lekérdezésekben használt indexekhez használja. A térbeli indexek tessellációiról további információt Térbeli adatokcímű témakörben talál.

1. példa

Az alábbi példakód egy legközelebbi szomszéd lekérdezést mutat be, amely térbeli indexet használhat. A példa a Person.Address mintaadatbázis AdventureWorks2025 táblát használja.

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

Hozzon létre egy térbeli indexet a SpatialLocation oszlopban annak megtekintéséhez, hogy a legközelebbi szomszéd lekérdezés hogyan használ térbeli indexet. További információ a térbeli indexek létrehozásáról: Térbeli indexek létrehozása, módosítása és elvetése.

2. példa

Az alábbi példakód egy legközelebbi szomszéd lekérdezést mutat be, amely nem tud térbeli indexet használni.

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

A lekérdezés hiányzik egy WHERE záradék, amely STDistance()-t használ a szintaxis szakaszban megadott formában, ezért a lekérdezés nem tud térbeli indexet használni.