2011-08-18 18 views
0

地方表如何在查詢也包含地理數據時使用連接表,在多個ID查詢中?

  • PlaceId PK
  • 名稱
  • 的GeoPoint(GeoPoint對象類型)
  • 等...

PlaceCats表(連接表)

  • PlaceId PK FK
  • CATID PK FK

PlaceCategories表

  • CATID PK
  • 名稱
  • 等...

這裏是我的查詢, 至返回的地方,在PlaceCats表中輸入條目(由一系列catIds),並在Lat/Lng值的25km範圍內。

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。我需要確保我沒有多次獲得同一個地方(因爲他們在連接表中可以有多個條目)。

更新

當我插入一個地方到地方臺,該GeoPoint的設置,像這樣:

SqlGeography.Point(sentPlace.Lat.Value, sentPlace.Lng.Value, 4326); 
+0

感謝格式編輯cularis,現在更容易閱讀查詢。 – Chaddeus

回答

2

它看起來像你對我有你的長/拉特南轅北轍。

至於選擇DISTINCT地區,你可以在一個嵌套查詢執行過WKT(知名文本)DISTINCT操作,見下圖:

SELECT 
GEOGRAPHY::STGeomFromText(WKT, [PROJECTION]) AS GEOG 
FROM 
(
    SELECT DISTINCT 
    GEOG.STAsText() AS WKT 
    FROM 
    [TABLE_NAME] 
) a 

您的查詢會是這個樣子:

SELECT * 
FROM 
[TABLE_NAME] WITH(INDEX([INDEX_NAME])) 
WHERE 
GEOG.STIntersects.(GEOGRAPHY::Point([Longitude], [Latitude], 4326)) = 1 
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 

一個更前端,假設你對你的表有一個空間索引,它通過使用索引命中加速空間查詢了沒有盡頭

+0

我一直在我的查詢中使用geography :: Point([Latitude],[Longitude],4326)......直到我開始嘗試修改連接以使用IN(WhereCount.CatId IN(2,3, 4,5))。 我更新了我的描述...查詢返回的地方,但我需要得到DISTINCT的地方。我不太關注你的嵌套查詢,這將如何適合我提出的查詢? 在索引中,我應該提供什麼值long/lat?這是我查詢的共同點嗎? – Chaddeus

+1

我已編輯我的答案,包括我認爲您的查詢shouold的樣子,希望它的作品!至於索引,有一個特定的「空間索引」,你可以在SQL 2008中使用。此外,不知道地理區域使用緯度/長度而不是長/拉特!每天學點新東西吧! – CatchingMonkey

+0

感謝您的查詢。 WKT的價值是多少?我知道它代表了Well Known Text ...而且,在嵌套查詢中,Places.GEOG.STASText()AS WKT會拋出一個錯誤:「無效的列名'GEOG'。」我編輯了我的問題,以顯示如何將GeoPoint數據插入表中,也許它很重要? – Chaddeus