2017-08-12 8 views
2

私は複数の行を持つテーブルを持っています。表には、非ヌル地理タイプの列があります。同じテーブル内の他の行から特定の距離以内にある行がある場合、地理的な列を持つテーブルのSQLクエリ

私は、ID、Latitude、Longitude、GeoDataという列を持つテーブルを持っているとします。 GeoData列はSQL Server 2016の地理的な種類の列です。

私は単一の点から特定の距離内の行を見つける方法を知っています。

は何で私が苦労していますと、* .ID自体を除く他のすべての行に対して、すべての行を比較するクエリを記述することである<> * .ID

私はそのようなものがあります。

SELECT * FROM GeoTable tableA 
INNER JOIN GeoTable tableB ON tableA.ID = tableB.ID 
WHERE tableA.GeoData.STDistance(tableB.GeoData) <= 500 AND tableA.ID <> 
tableB.ID 

をしかし、それは私がしたいことをしていない。

ご協力いただければ幸いです!

答えて

0

クロスジョインが必要なようです。これにより、2つのテーブルの間にデカルト積が生成されます。あなたはそれについてhereを読むことができます。テーブルが非常に大きい場合、パフォーマンスはあまり良くありません。これは問題ですか?

SELECT * FROM GeoTable tableA 
OUTER APPLY GeoTable tableB 
WHERE tableA.GeoData.STDistance(tableB.GeoData) <= 500 AND tableA.ID <> tableB.ID 

これはあなたがやりたいしない場合は、私に教えてください、と我々はそれを改善するために働くことができます。

0

私が探していた結果を得ることができました。ここで

コードです:

SELECT 
    tableA.*, 
    tableB.*, 
    tableA.GeoData.STDistance(tableB.GeoData) AS DistanceApart 
FROM GeoTable tableA 
JOIN GeoTable tableB 
ON (tableA.GeoData.STDistance(tableB.GeoData) <= 500) AND tableA.ID <> tableB.ID ORDER BY DistanceApart 

はしかし、@BWarnerによって与えられた答えはまた、同じ結果を達成し、私が何を望むかを正確にあるので、あなたに感謝!

このクエリのパフォーマンスを向上させるにはどうすればよいですか?

関連する問題