Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Географски тип данни на SQL Server най-близката точка на линията

Можете да съхранявате вашите обекти в GEOGRAPHY колона и създайте SPATIAL INDEX над тази колона.

За съжаление, SQL Server прилага пространствени индекси чрез подреждане на повърхността и съхраняване на идентификаторите на плочки в обикновено B-Tree индекс, така че обикновен ORDER BY STDistance няма да работи (е, ще работи, но няма да използва индекса).

Вместо това ще трябва да направите заявка, подобна на тази:

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

По този начин SQL Server първо ще търси пътища в рамките на 1 километър от вашата точка, след това в рамките на 2 километри и т.н., като всеки път използвате индекса.

Актуализация:

Ако имате няколко точки в таблица и искате да намерите най-близката точка за всяка от тях:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Неявни преобразувания и закръгляния

  2. Вмъкване на повече от 1000 реда от Excel в SQLServer

  3. Има ли разлика в производителността между CTE, подзаявка, временна таблица или таблична променлива?

  4. Често срещани грешки в SQL сървъра

  5. Странност на кода за връщане на съхранена процедура на SQL Server