Sql problema de consulta de 2008 - que LatLong de existe em uma geografia polígono?
-
08-07-2019 - |
Pergunta
Eu tenho duas tabelas a seguir: -
GeoShapes
- GeoShapeId INT IDENTIDADE
- Nome VARCHAR (100)
- ShapeFile GEOGRAFIA [este é um polígono fechado de Lat / Longs]
CrimeLocations
- CrimeLocationId INT IDENTIDADE
- LatLong GEOGRAFIA [este é um Lat / Long Point]
Agora, eu tenho em torno de resultados 10K GeoShape e ao redor 500CrimeLocations.
Eu estou tentando descobrir qual GeoShapes todos os 500 crime lat / pontos longos existir dentro de.
:( Eu só não entendi! Eu estava tentando fazer um STIntersects
em uma subconsulta, mas que não funcionou. Alguma sugestão?
aplausos!
EDIT 1:. Eu não pode usar quaisquer funções GEOMETRY
.. porque (como dito acima) estes são todos os tipos de geografia
EDIT 2: Eu sei como usar STContains
e STIntersects
. Por favor, não fornecem exemplos básicos do que isso. Eu estou mais curioso sobre a fazer uma consulta complexa com a minha estrutura da tabela, acima.
Solução
Quanto às suas 'edições', não é muitas vezes você vê uma pergunta que inclui "não forneça ...". Certamente cada pouco ajuda? Particularmente desde que você não tem realmente nos mostraram o que você do saber sobre STContains
ou STIntersects
(ou Filter()
para que o assunto) ...
De qualquer forma, eu tinha um banco de dados de códigos postais e storelocations acessível, então eu renomeado as tabelas / colunas para combinar seu (Em seguida, tenho 6,535 CrimeLocatoins e 3.285 GeoShapes). Eu presumo que você já percebi isso por agora - mas alguém pode encontrar este útil ...
Os seguintes retornos de consulta o número de CrimeLocations em cada 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
É preciso idades (como 20 minutos) porque eu não tenho a configuração quaisquer índices geoespaciais e meus shapefiles têm um alto ponto de contagem, mas é executado com êxito. Se eu quisesse restringir os resultados como você sugere:
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
É claro que você não quer para codificar o número 500 -. Assim você pode adicionar uma subconsulta COUNT(*) FROM CrimeLocations
lá, ou uma variável com o total a partir de uma consulta separada
Isso é suficiente complexo?