Dela via


Fråga efter rumsliga data för närmaste granne

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-analysslutpunkt i Microsoft FabricWarehouse i Microsoft FabricSQL-databas i Microsoft Fabric

En vanlig fråga som används med rumsliga data är den närmaste grannfrågan. Närmsta grannfrågor används för att hitta närmaste rumsliga objekt till ett specifikt rumsligt objekt. Till exempel måste en butikslokaliserare för en webbplats ofta hitta de närmaste butiksplatserna till en kundplats.

En närmaste grannfråga kan skrivas i olika giltiga frågeformat, men för att närmaste grannfråga ska kunna använda ett rumsligt index måste följande syntax användas.

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

Närmaste grannfråga och rumsliga index

I SQL Server används TOP- och ORDER BY-satser för att utföra en närmaste grannfråga på spatiala datakolumner. Satsen ORDER BY innehåller ett anrop till metoden STDistance() för datatypen spatial kolumn. Satsen TOP anger antalet objekt som ska returneras för frågan.

Följande krav måste uppfyllas för att en närmaste grannfråga ska kunna använda ett rumsligt index:

  1. Ett rumsligt index måste finnas på en av de rumsliga kolumnerna och metoden STDistance() måste använda kolumnen i satserna WHERE och ORDER BY.

  2. Satsen TOP får inte innehålla en PERCENT-instruktion.

  3. Satsen WHERE måste innehålla en STDistance()-metod.

  4. Om det finns flera predikat i WHERE-satsen måste predikatet som innehåller STDistance()-metoden anslutas med en AND konjunktion till de andra predikaten. Metoden STDistance() kan inte finnas i en valfri del av WHERE-satsen.

  5. Det första uttrycket i ORDER BY-satsen måste använda metoden STDistance().

  6. Sorteringsordningen för det första STDistance() uttrycket i ORDER BY-satsen måste vara ASC.

  7. Alla rader som STDistance returnerar NULL måste filtreras bort.

Varning

Metoder som tar geografi eller geometri datatyper som argument returnerar NULL om SRID:erna inte är samma för typerna.

Vi rekommenderar att de nya spatiala indexindelningarna används för index som används i närmaste grannsökningar. Mer information om spatial index-tessellationer finns i Spatial Data.

Exempel 1

I följande kodexempel visas en närmaste grannfråga som kan använda ett rumsligt index. I exemplet används tabellen Person.Address i AdventureWorks2022 exempeldatabas.

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

Skapa ett rumsligt index i kolumnen SpatialLocation för att se hur en närmaste grannfråga använder ett rumsligt index. Mer information om hur du skapar rumsliga index finns i Skapa, ändra och släppa rumsliga index.

Exempel 2

I följande kodexempel visas en närmaste grannfråga som inte kan använda ett rumsligt index.

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

Frågan saknar en WHERE-sats som använder STDistance() i ett formulär som anges i syntaxavsnittet så att frågan inte kan använda ett rumsligt index.