Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Una query comune usata con i dati spaziali è la query Nearest Neighbor. Le query Nearest Neighbor 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 Nearest Neighbor può essere scritta in un'ampia gamma di formati di query validi, ma per utilizzare un indice spaziale nella query Nearest Neighbor, è 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 del vicino più prossimo e indici spaziali
In SQL Server TOP e ORDER BY le clausole vengono usate per eseguire una query Nearest Neighbor 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 Nearest Neighbor:
In una delle colonne spaziali deve essere presente un indice spaziale e tale colonna deve essere utilizzata dal metodo
STDistance()nelle clausoleWHEREeORDER BY.La clausola
TOPnon può contenere un'istruzionePERCENT.La clausola
WHEREdeve contenere un metodoSTDistance().Se nella clausola
WHEREsono presenti più predicati, il predicato che contiene il metodoSTDistance()deve essere connesso mediante una congiunzioneANDad altri predicati. Il metodoSTDistance()non può trovarsi in una parte facoltativa della clausolaWHERE.La prima espressione nella clausola
ORDER BYdeve utilizzare il metodoSTDistance().L'ordinamento per la prima espressione
STDistance()nella clausolaORDER BYdeve essereASC.Devono essere filtrate tutte le righe per le quali
STDistancerestituisceNULL.
Avvertimento
I metodi che accettano geography o geometry tipi di dati come argomenti restituiranno NULL se gli SRID non sono uguali per i tipi.
È consigliabile usare le nuove tassellature dell'indice spaziale per gli indici usati nelle query Nearest Neighbor. Per altre informazioni sulle tassellature dell'indice spaziale, vedere Dati spaziali (SQL Server).For more information on spatial index tessellations, see Spatial Data (SQL Server).
Esempio
Nell'esempio di codice seguente viene illustrata una query Nearest Neighbor che può usare un indice spaziale. Nell'esempio viene utilizzata la Person.Address tabella nel AdventureWorks2012 database.
USE AdventureWorks2012
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 come una query Nearest Neighbor usa un indice spaziale. Per ulteriori informazioni sulla creazione di indici spaziali, vedere Create, Modify, and Drop Spatial Indexes.
Esempio
Nell'esempio di codice seguente viene illustrata una query Nearest Neighbor che non può usare un indice spaziale.
USE AdventureWorks2012
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.