sql >> Databáze >  >> RDS >> Sqlserver

SQL Server Geography datový typ nejbližšího bodu na řádku

Své objekty můžete uložit do GEOGRAPHY a vytvořte SPATIAL INDEX nad tímto sloupcem.

Bohužel SQL Server implementuje prostorové indexy uspořádáním povrchu a uložením identifikátorů dlaždic do prostého B-Tree index, tedy prostý ORDER BY STDistance nebude fungovat (dobře, bude fungovat, ale nebude používat index).

Místo toho budete muset vytvořit dotaz podobný tomuto:

DECLARE @mypoint GEOGRAPHY
SET @mypoint = geography::STGeomFromText('POINT(@mylat, @mylon)', 4326);

WITH    num (distance) AS
        (
        SELECT  1000
        UNION ALL
        SELECT  distance + 1000
        FROM    num
        WHERE   distance <= 50000
        )
SELECT  TOP 1 m.*
FROM    num
CROSS APPLY
        (
        SELECT  TOP 1 *
        FROM    mytable
        WHERE   myroad.STDistance(@mypoint) <= distance
        ORDER BY
                STDistance(@mypoint)
        ) m

Tímto způsobem SQL Server nejprve prohledá silnice v okruhu 1 kilometr od vašeho bodu, poté do 2 kilometrů atd. pokaždé pomocí indexu.

Aktualizace:

Pokud máte v tabulce více bodů a chcete pro každý z nich najít nejbližší bod:

WITH    num (distance) AS
        (
        SELECT  1000
        UNION ALL
        SELECT  distance + 1000
        FROM    num
        WHERE   distance <= 50000
        )
SELECT  mp.mypoint, m.*
FROM    @mypoints mp
CROSS APPLY
        (
        SELECT  TOP 1 m.*
        FROM    num
        CROSS APPLY
                (
                SELECT  TOP 1 *
                FROM    mytable
                WHERE   myroad.STDistance(@mypoint) <= distance
                ORDER BY
                        STDistance(@mypoint)
                ) m
        ) m


  1. Funkce bind_param() na neobjektu | PHP MySQL

  2. Přepsání dotazu se nezdaří, pokud MV používá ASNI Join

  3. Vytvořte dotaz v SQL Server 2017

  4. java.lang.IllegalStateException:Pokus o provedení operace na uzavřené EntityManagerFactory