2016-12-08 23 views
0

我有一個表稱爲PostDkServicePoint存儲一堆經度/緯度位置SQL查詢。我今天就這樣稱呼它 - 它將找到指定的lat/lng參數的前30個最接近的位置。母兒加入所需的SQL Server

SELECT TOP (30) 
    PostDkServicePoint.location.Lat AS latitude,  
    PostDkServicePoint.location.Long AS longitude, 
    PostDkServicePoint.servicePointId 
FROM   
    PostDkServicePoint 
WHERE  
    (PostDkServicePoint.location.STDistance('POINT(40.587990 -73.662457)') IS NOT NULL) 
ORDER BY 
    PostDkServicePoint.location.STDistance('POINT(40.587990 -73.662457)') 

現在我有另一個表稱爲PostDkOpeningHour

openingHoursId int 
servicePointId int 
day varchar 
from1 varchar 
to1 varchar 

實例行:

1233 5725 MONDAY  07:00 19:00 
1234 5725 TUESDAY  07:00 19:00 
1235 5725 WEDNESDAY 07:00 19:00 
1236 5725 THURSDAY 07:00 19:00 

它包含total.I 24000行要加入這兩個表,以便爲每個從上述postdkservicepoint SQL查詢返回的30行也會顯示PostDkOpeningHour表中所有匹配的子行(其中servicepointid是兩張桌子)。

有了這樣的「加入」查詢 - 將緯度/經度數據然後就被複制的每一行與開放時間的數據是這樣的:

5725 40.587990 -73.662457 MONDAY 07:00 19:00 
5725 40.587121 -73.662412 TUESDAY 07:00 19:00 

或者是有沒有辦法更歸還父母的孩子關係風格?

回答

0

依我拙見,你應該先得到30條記錄,然後與PostDkServicePoint JOIN來獲取相關行。

WITH CTE (latitude, longitude, servicePointId) AS 
(
SELECT TOP (30) 
    PostDkServicePoint.location.Lat AS latitude,  
    PostDkServicePoint.location.Long AS longitude, 
    PostDkServicePoint.servicePointId 
FROM   
    PostDkServicePoint 
WHERE  
    (PostDkServicePoint.location.STDistance('POINT(40.587990 -73.662457)') IS NOT NULL) 
ORDER BY 
    PostDkServicePoint.location.STDistance('POINT(40.587990 -73.662457)') 
) 
SELECT 
    cte.servicePointId, 
    cte.latitude, 
    cte.longitude, 
    PostDkOpeningHour.day, 
    PostDkOpeningHour.from1, 
    PostDkOpeningHour.to1 
FROM 
    cte 
    INNER JOIN PostDkOpeningHour 
     ON cte.servicePointId = PostDkOpeningHour.servicePointId; 
+0

好的謝謝。我做這行得到一個錯誤,當我運行代碼:「」 cte.servicePointId 消息102,級別15,狀態1,行16 附近有語法錯誤。 –

+0

你可以發佈第一個查詢的一些數據結果嗎?只是爲了建立一個測試環境。 – McNets

+0

好吧,有一個缺少','請檢查它在這裏,http://rextester.com/VQH68668我已經模擬了頂部(10) – McNets

0

如果您只是執行的線沿線的查詢:

select a.Col1 
     ,a.Col2 
     ,b.Col1 
     ,b.Col2 
from TableA a 
    inner join TableB b 
     on(a.ID = b.FKID) 

那裏有5行TableA中,每個ID 5000點匹配的行TableB中,那麼,你的輸出將有爲每個返回的行匹配來自兩個表的數據,導致每個TableA行重複5000次。

這是一個簡單的SQL如何工作的,有沒有辦法否則返回您的數據,除非你正在返回多個數據集,並在您的應用程序以後一起加入他們。一般來說,這樣做的網絡傳輸收益遠遠超過了在應用程序中將數據加回到一起的處理時間,因爲SQL在數據處理方面的效率非常高。

如果您的網絡流量是十分寶貴的,你絕對需要每行值 - 即:你是不是聚合數據恢復 - 那麼你可能想探索在應用程序加入,但通常不建議它。

+0

@mcNets所以你的問題在這裏,'TOP 30'是否只會影響第一個表格或整個最終數據集? – iamdave

+0

我的意思是它將如何影響整個最終數據集返回時的性能 - 當有重複。 –

+0

是mcNets - 這就是我的目標。 –