位置表
PlaceCats表(联接表)
PlaceCategories表
这是我的查询,返回地点,包含PlaceCats表中的条目(通过一系列catIds),并且在Lat / Lng值的25公里范围内。
SELECT Places.*
FROM Places
INNER JOIN PlaceCats
ON Places.PlaceId = PlaceCats.PlaceId
WHERE PlaceCats.CatId IN (2,3,4,5)
AND Places.GeoPoint.STDistance(geography::Point(35.75094975999387, 139.39780220389366, 4326)) < ((25 * 1000))
ORDER BY Places.Name ASC
它返回的地方,但我需要在SELECT之后添加DISTINCT ...显然你在选择地理数据时不能使用DISTINCT。我需要确保我没有多次获得相同的位置(因为他们可以在连接表中有多个条目)。
更新
当我在Places表中插入一个地点时,GeoPoint的设置如下:
SqlGeography.Point(sentPlace.Lat.Value, sentPlace.Lng.Value, 4326);
答案 0 :(得分:2)
在我看来,你的长期/拉特错误的方式。
至于选择DISTINCT地理位置,您可以在嵌套查询中对WKT(熟知文本)执行DISTINCT操作,请参见下文:
SELECT
GEOGRAPHY::STGeomFromText(WKT, [PROJECTION]) AS GEOG
FROM
(
SELECT DISTINCT
GEOG.STAsText() AS WKT
FROM
[TABLE_NAME]
) a
您的查询将如下所示:
SELECT
a.*
, GEOGRAPHY::STGeomFromText(WKT, 4326) AS GEOG
FROM
(
SELECT DISTINCT
Places.[COL1]
, Places.[COL2]
, Places.[COL3]
, Places.[COL4]
...
...
, Places.GeoPoint.STAsText() AS WKT
FROM
Places
INNER JOIN
PlaceCats
ON
Places.PlaceId = PlaceCats.PlaceId
WHERE PlaceCats.CatId IN (2,3,4,5)
AND
Places.GeoPoint.STDistance(GEOGRAPHY::Point(35.75094975999387, 139.39780220389366, 4326)) < ((25 * 1000))
ORDER BY Places.Name ASC
)a
还有一个提示,假设你的桌子上有空间索引,它可以通过使用索引命中来加速空间查询:
SELECT *
FROM
[TABLE_NAME] WITH(INDEX([INDEX_NAME]))
WHERE
GEOG.STIntersects.(GEOGRAPHY::Point([Longitude], [Latitude], 4326)) = 1