Condividi tramite


Eseguire query sui dati spaziali per il vicino più vicino

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure endpoint di analisi SQL in Microsoft Fabric Warehouse nel database SQL di Microsoft Fabric in Microsoft Fabric

Una query comune usata con i dati spaziali è la query vicina più vicina. Le query adiacenti più vicine vengono usate per trovare gli oggetti spaziali più vicini a un oggetto spaziale specifico. Ad esempio, un localizzatore di punti vendita per un sito Web spesso deve trovare le posizioni più vicine dei negozi a una posizione del cliente.

Una query vicina più vicina può essere scritta in vari formati di query validi, ma per la query vicina più vicina è necessario usare un indice spaziale, è necessario usare la sintassi seguente.

Sintassi

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

Query e indici spaziali più vicini

In SQL Server TOP e ORDER BY le clausole vengono usate per eseguire una query vicina più vicina sulle colonne di dati spaziali. La clausola ORDER BY contiene una chiamata al metodo STDistance() per il tipo di dati della colonna spaziale. La clausola TOP indica il numero di oggetti da restituire per la query.

Per usare un indice spaziale, è necessario soddisfare i requisiti seguenti per una query vicina più vicina:

  1. In una delle colonne spaziali deve essere presente un indice spaziale e tale colonna deve essere utilizzata dal metodo STDistance() nelle clausole WHERE e ORDER BY.

  2. La clausola TOP non può contenere un'istruzione PERCENT.

  3. La clausola WHERE deve contenere un metodo STDistance().

  4. Se nella clausola WHERE sono presenti più predicati, il predicato che contiene il metodo STDistance() deve essere connesso mediante una congiunzione AND ad altri predicati. Il metodo STDistance() non può trovarsi in una parte facoltativa della clausola WHERE.

  5. La prima espressione nella clausola ORDER BY deve utilizzare il metodo STDistance().

  6. L'ordinamento per la prima espressione STDistance() nella clausola ORDER BY deve essere ASC.

  7. Devono essere filtrate tutte le righe per le quali STDistance restituisce NULL.

Avviso

I metodi che accettano tipi di dati geography o geometry come argomenti restituiranno NULL se gli SRID non sono uguali per i tipi.

È consigliabile usare i nuovi tassellamenti di indice spaziale per gli indici usati nelle query adiacenti più vicine. Per altre informazioni sulle tassellature dell'indice spaziale, vedere Dati spaziali.

Esempio 1

Nell'esempio di codice seguente viene illustrata una query vicina più vicina che può usare un indice spaziale. L’esempio usa la tabella Person.Address del database di esempio AdventureWorks2022.

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

Creare un indice spaziale nella colonna SpatialLocation per vedere in che modo una query vicina più vicina usa un indice spaziale. Per ulteriori informazioni sulla creazione di indici spaziali, vedere Create, Modify, and Drop Spatial Indexes.

Esempio 2

Nell'esempio di codice seguente viene illustrata una query vicina più vicina che non può usare un indice spaziale.

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

Nella query manca una clausola WHERE che utilizza STDistance() in un formato specificato nella sezione relativa alla sintassi, pertanto nella query non può essere utilizzato un indice spaziale.