2012-03-02 1 views
0

У меня есть две таблицы А и В, в SQL Server 2008:Как обновить таблицу из пространственного запроса

A 
lon(float) 
lat(float) 
name (nvarchar) 

B 
name (nvarchar) 
the_geom (geometry) 

В основном таблица B содержит площадь многоугольников, и таблица А содержит координаты точки в двух столбцах. Я хочу обновить таблицу A с именем области, если точка, определенная в столбцах lon/lat, находится внутри многоугольника в таблице B. Какова правильная команда T-SQL? Это мой неудачный запрос:

UPDATE A SET name = (SELECT name FROM B WHERE 
the_geom.STIntersects(geography::Point([A.lat], [A.Lon], 4326))>0) 
+0

Я предполагаю, что вы проверили, что 2 таблицы пересекаются ... – CatchingMonkey

ответ

0

Кажется, вы смешиваете пространственные типы и x/y. (Геометрия и география различны).

Вы можете написать свой запрос как:

UPDATE A SET name = (SELECT name FROM B WHERE 
    the_geom.STIntersects(
      geometry::STPointFromText(
       'POINT(' + [A.long] + ' ' + [A.lat] + ')', 4326 
     ) 
    )=1) 

ли на самом деле старались не выше, но это должно дать все, что вам нужно решить эту проблему. Если вы хотите продолжить использование географии, вы также можете создать ее так же, как и вы, верните ее в WKB, а затем в экземпляр геометрии через WKB (геометрия :: STGeomFromWKB (география :: AsBinary())

+0

Спасибо за внимание. Я получаю недопустимое имя столбца «a.Lon», хотя таблица имеет этот столбец –

+0

Я не говорю, что это пространственная проблема, с которой вы сталкиваетесь ... Если вы можете опубликовать сценарии создания таблицы, и я соберу запрос – George

+0

CREATE TABLE [DBO]. [Область] ( \t [GID] [INT] IDENTITY (1,1) NOT NULL, \t [ИМЯ] [NVARCHAR] (256) NULL, то \t [the_geom] [геометрии ] NULL, то CONSTRAINT [PK_export_attiki] ПЕРВИЧНЫЙ КЛЮЧ CLUSTERED ( \t [GID] ASC ) С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = ВЫКЛ, IGNORE_DUP_KEY = ВЫКЛ, ALLOW_ROW_LOCKS = ON ALLOW_PAGE_LOCKS = ВКЛ) ВКЛ [ОСНОВНОЙ] ) ON [ПЕРВИЧНО] –

0

Это может звучать как " dahh ', но разве вы не должны использовать deal.lon вместо A.lon?

UPDATE deals SET area = (SELECT name FROM areas WHERE the_geom.STIntersects (geometry :: STPointFromText (' POINT ('+ [deals] . [долгота] + '' + [сделок] [лат] +. ')', 4326)) = 1)

+0

Хорошо заметили, но он все равно дает мне та же ошибка. Мне кажется, что коррелированный подзапрос не может разрешить внешнюю таблицу, потому что он находится внутри функции STPointFromText. –

1

следующие работы для меня:

UPDATE Deals SET Area = (
    SELECT NAME FROM Areas WHERE 
     the_geom.STIntersects(
      geometry::STGeomFromText(
       'POINT(' + CAST(Deals.Lon AS varchar) + ' ' + CAST(Deals.Lat AS varchar) + ')',4326) 
       ) = 1 
    )