如何在多ID查询中查询还包含地理数据时使用连接表?

时间:2011-08-18 12:35:34

标签: sql sql-server-2008

位置表

  • PlaceId PK
  • 名称
  • GeoPoint(GeoPoint类型)
  • 等...

PlaceCats表(联接表)

  • PlaceId PK FK
  • CatId PK FK

PlaceCategories表

  • CatId PK
  • 姓名
  • 等...

这是我的查询,返回地点,包含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);

1 个答案:

答案 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