Проблема запроса Sql 2008 - какой LatLong существует в географическом полигоне? - PullRequest
4 голосов
/ 20 ноября 2008

у меня есть следующие две таблицы: -

GeoShapes

  • GeoShapeId INT IDENTITY
  • Имя VARCHAR (100)
  • ShapeFile GEOGRAPHY [это замкнутый многоугольник широты / долготы]

CrimeLocations

  • CrimeLocationId INT IDENTITY
  • LatLong GEOGRAPHY [это широта / длинная точка]

Теперь у меня есть около 10K результатов GeoShape и около 500CrimeLocations.

Я пытаюсь выяснить, в каких GeoShapes существуют все 500 криминальных лат / длинных точек.

:( Я просто не понимаю! Я пытался сделать STIntersects для подзапроса, но это не сработало. Есть предложения?

ура!

РЕДАКТИРОВАТЬ 1: Я не могу использовать никакие функции GEOMETRY, потому что (как указано выше) это все типы географии.

РЕДАКТИРОВАТЬ 2: я знаю, как использовать STContains и STIntersects. Пожалуйста, не приводите основные примеры этого. Мне более интересно выполнить сложный запрос с моей структурой таблицы, приведенной выше.

1 Ответ

6 голосов
/ 11 октября 2009

Что касается ваших «правок», то не часто вы видите вопрос с надписью «пожалуйста, не предоставляйте ...». Конечно, каждый немного помогает? Тем более, что вы на самом деле не показали нам, что вы делаете знаете о STContains или STIntersects (или Filter() в этом отношении) ...

В любом случае, у меня была удобная база данных почтовых индексов и мест хранения, поэтому я переименовал таблицы / столбцы, чтобы они соответствовали вашим (у меня тогда было 6 535 CrimeLocatoins и 3 285 GeoShapes). Я предполагаю, что вы уже поняли это - но кто-то еще может найти это полезным ...

Следующий запрос возвращает количество CrimeLocations в каждом GeoShapes.ShapeFile

SELECT G.Name, COUNT(CL.Id)
FROM   GeoShapes G
INNER JOIN CrimeLocations CL ON G.ShapeFile.STIntersects(CL.LatLong) = 1
GROUP BY G.Name
ORDER BY 2 DESC

Требуется возраст (например, 20 минут), потому что я не настроил никаких геопространственных индексов, и мои ShapeFiles имеют высокий счетчик точек, но он работает успешно. Если бы я хотел ограничить результаты, как вы предлагаете:

SELECT G.Name, COUNT(CL.Id)
FROM   GeoShapes G
INNER JOIN CrimeLocations CL ON G.ShapeFile.STIntersects(CL.LatLong) = 1
GROUP BY G.Name
HAVING COUNT(CL.Id) = 500

Конечно, вы не хотите жестко кодировать число 500 - так что вы можете добавить туда подзапрос COUNT(*) FROM CrimeLocations или переменную с итогом из отдельного запроса.

Это достаточно сложно?

...