Sdílet prostřednictvím


Dotazování prostorových dat pro nejbližšího souseda

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed Instancekoncový bod služby SQL Analytics v Microsoft FabricWarehouse v Microsoft Fabricdatabá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:

  1. Prostorový index musí být přítomný na jednom z prostorových sloupců a metoda STDistance() musí tento sloupec použít v klauzulích WHERE a ORDER BY.

  2. Klauzule TOP nemůže obsahovat příkaz PERCENT.

  3. Klauzule WHERE musí obsahovat metodu STDistance().

  4. Pokud je v klauzuli WHERE více predikátů, musí být predikát obsahující STDistance() metodu připojen AND spojením s ostatními predikáty. Metoda STDistance() nemůže být v volitelné části klauzule WHERE.

  5. První výraz v klauzuli ORDER BY musí používat metodu STDistance().

  6. Pořadí řazení prvního výrazu STDistance() v klauzuli ORDER BY musí být ASC.

  7. 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.