2016-09-07 22 views
0

地理的なデータを含む2つのテーブルがあります。
table1からtable2の余分なフィールドをすべて取得するには、table1からtable2に内部結合します。
私は、次の試した :ノー結果と会ったが、両方のテーブルの緯度long型の まったく同じペアがあることが確認されている内部結合戻る結果なしMS SQL Server

select a.*, b.field from table1 a 
inner join table2 b 
on (cast(a.Latitude as float) = cast(b.Latitude as float)) 
and (cast(a.Longitude as float) = cast(b.Longitude as float)) 

小切手として、私はちょうど緯度で結合し、次に経度で結果を得ました。したがって、緯度と経度の両方を結合することに問題があるようです。

+2

なぜあなたはfloatとしてキャストしていますか? – vercelli

+0

私はデータ型エラーを避けるためにキャストしようとしましたが、その不要なものは実現しませんでした。キャストなしで問題が発生する – rs7496

答えて

3

浮動小数点数の結合は、単に間違ったことです。もしSQLパースがこれをしようとすると警告を返すといいでしょう。問題は、浮動小数点数は同じに見えますが、最後のビットでは実際には異なることです。

まず、(10進数または文字でなければなりません)ネイティブ型を使用してみてください:

select a.*, b.field 
from table1 a inner join 
    table2 b 
    on a.Latitude = b.Latitude and 
     a.Longitude = b.Longitude ; 

問題が解決しない場合、あなたはこのようにロジックを使用することができます。

select a.*, b.field 
from table1 a inner join 
    table2 b 
    on a.Latitude between b.Latitude - 0.0001 and b.Latitude + 0.0001 and 
     a.Longitude between b.Longitude - 0.0001 and b.Longitude + 0.0001; 

0.0001値がわずかに異なる場合に同じ値であることを識別するための任意の閾値である。私は正しい価値が何であるか分かりません。しかし、これはせいぜい約36フィート(11メートル)に相当するので、合理的な精度のようです。

ストーリーの道徳は、固定長の小数点精度を使用して、またはGISパッケージの表現を使用して、ラットとロングを格納する必要があるということです。

+0

+ - + 0.0001の理由は何ですか? – TheGameiswar

+0

ネイティブタイプを試しましたが、結果はまだありませんでしたが、2番目の提案に感謝します!私は緯度の長いものは正確に正しいもの(私は非常に近いGPSの点がたくさんある)に参加していることを確認するためにそれを行った - 0.0000001と結合が動作するようだ。 – rs7496

0
select a.*, b.field from table1 a 
inner join table2 b 
on (a.Latitude = b.Latitude and a.Longitude = b.Longitude) 

キャストは不要です。これは、両方ともLatitudeであり、同じデータ型になるためです。

関連する問題