2016-12-08 7 views
0

私はPostDkServicePointと呼ばれるテーブルを持ち、経度/緯度の場所の束を格納しています。私は今日このように呼んでいます - 指定されたポイントlat/lngパラメータに最も近い30の最も近い位置を見つけるでしょう。親子の参​​加SQLクエリがSQL Serverに必要です

openingHoursId int 
servicePointId int 
day varchar 
from1 varchar 
to1 varchar 

例行:

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と呼ばれている

それはtotal.Iで24000行を含む
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 

は、2つのテーブルを結合したくなるように、それぞれについて上記のpostdkservicepoint SQLクエリから返された30行は、PostDkOpeningHourテーブル内のすべての一致する子ローも表示されます(ここで、servicepointidは、 2つのテーブル)。

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

あなたは、単にの線に沿ってクエリを実行している場合:テーブルAの5行とテーブルBにおけるIDあたり5000の一致する行がある

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

は、[はい、あなたの出力がありますが各行の両方のテーブルから一致するデータが返され、結果として各TableA行が5000回複製されます。

これは単純にSQLの動作方法であり、複数のデータセットを返して後でアプリケーションで結合する場合を除き、データを返す方法はありません。通常、データ操作時にSQLが非常に効率的であるため、これを実行する際のネットワーク転送の利益は、アプリケーションでデータを再び結合する処理時間よりもはるかに優れています。

ネットワークトラフィックが重視され、すべての行の値が絶対的に必要な場合(つまり、返されたデータを集約していない場合)は、通常はアドバイスしていませんが、

+0

@mcNets 'TOP 30'が最初のテーブルか最終的なデータセット全体だけに影響を与えるかどうか、ここにあなたの質問はありますか? – iamdave

+0

私はそれが返された最終的なデータセット全体のパフォーマンスにどのように影響するかを意味しました。重複がある場合。 –

+0

はいmcNets - それが私が目指しているものです。 –

関連する問題