内部联接返回无结果MS SQL Server

时间:2016-09-07 11:40:48

标签: sql sql-server database join sql-server-2014

我有两张包含地理数据的表格 我希望将table1连接到table2以获取table1的所有内容,但是使用table2中的额外字段 当我尝试以下内容时:

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 个答案:

答案 0 :(得分:3)

加入浮点数是完全错误的。如果SQL解析器在尝试执行此操作时返回警告,那将是很好的。问题是浮点数看起来可能相同,但最后一位确实不同。

首先,尝试使用本机类型(应该是十进制或字符):

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包中的表示来存储拉特和长篇。

答案 1 :(得分:0)

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

您不需要演员,因为两者都是纬度,并且具有相同的数据类型。

相关问题