Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance
Azure SQLKoncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databáze 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.
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 ]
[ ; ]
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íchWHEREaORDER BY.Klauzule
TOPnemůže obsahovat příkazPERCENT.Klauzule
WHEREmusí obsahovat metoduSTDistance().Pokud je v klauzuli
WHEREvíce predikátů, musí být predikát obsahujícíSTDistance()metodu připojenANDspojením s ostatními predikáty. MetodaSTDistance()nemůže být v volitelné části klauzuleWHERE.První výraz v klauzuli
ORDER BYmusí používat metoduSTDistance().Pořadí řazení prvního výrazu
STDistance()v klauzuliORDER BYmusí býtASC.Všechny řádky, pro které
STDistancevracíNULL, musí být vyfiltrovány.
Warning
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 AdventureWorks2025.
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.