Dotazování prostorových dat pro nejbližšího souseda
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
koncový bod služby SQL Analytics v Microsoft Fabric
Warehouse v Microsoft Fabric
databázi SQL v Microsoft Fabric
Běžným dotazem používaným s prostorovými daty je nejbližší sousední dotaz. Dotazy nejbližšího souseda slouží k vyhledání nejbližších prostorových objektů ke konkrétnímu prostorovému objektu. Například vyhledávač obchodů na webu často musí najít nejbližší polohu obchodu k poloze zákazníka.
Dotaz nejbližšího souseda lze zapsat v různých platných formátech dotazu, ale pro nejbližší sousední dotaz se musí použít prostorový index následující syntaxe.
Syntaxe
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 ]
[ ; ]
Dotaz nejbližšího souseda a prostorové indexy
V SQL Serveru se k provedení dotazu nejbližšího souseda na sloupce prostorových dat používají klauzule TOP
a ORDER BY
. Klauzule ORDER BY
obsahuje volání metody STDistance()
pro datový typ prostorového sloupce. Klauzule TOP
označuje počet objektů, které se mají vrátit pro dotaz.
Aby dotaz nejbližšího souseda používal prostorový index, musí být splněny následující požadavky:
Prostorový index musí být přítomný na jednom z prostorových sloupců a metoda
STDistance()
musí tento sloupec použít v klauzulíchWHERE
aORDER BY
.Klauzule
TOP
nemůže obsahovat příkazPERCENT
.Klauzule
WHERE
musí obsahovat metoduSTDistance()
.Pokud je v klauzuli
WHERE
více predikátů, musí být predikát obsahujícíSTDistance()
metodu připojenAND
spojením s ostatními predikáty. MetodaSTDistance()
nemůže být v volitelné části klauzuleWHERE
.První výraz v klauzuli
ORDER BY
musí používat metoduSTDistance()
.Pořadí řazení prvního výrazu
STDistance()
v klauzuliORDER BY
musí býtASC
.Všechny řádky, pro které
STDistance
vracíNULL
, musí být vyfiltrovány.
Varování
Metody, které berou jako argumenty datové typy geografické nebo geometrii, vrátí NULL
, pokud identifikátory SRID nejsou stejné pro typy.
Doporučuje se, aby se nové tesselace prostorového indexu používaly pro indexy používané v dotazech na nejbližšího souseda. Další informace o dlaždicování prostorových indexů naleznete v tématu Spatial Data.
Příklad 1
Následující příklad kódu ukazuje dotaz nejbližšího souseda, který může použít prostorový index. Příklad používá tabulku Person.Address
v ukázkové databázi 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);
Vytvořte prostorový index ve sloupci SpatialLocation, abyste viděli, jak dotaz nejbližšího souseda používá prostorový index. Další informace o vytváření prostorových indexů naleznete v tématu Vytvoření, úprava a přetažení prostorových indexů.
Příklad 2
Následující příklad kódu ukazuje dotaz nejbližšího souseda, který nemůže použít prostorový 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);
Dotaz nemá klauzuli WHERE
, která používá STDistance()
ve formuláři zadaném v oddílu syntaxe, takže dotaz nemůže použít prostorový index.