【问题标题】:Inner Join Returning No Results MS SQL Server内部联接返回无结果 MS SQL Server
【发布时间】:2016-09-07 11:40:47
【问题描述】:

我有两个包含地理数据的表。
我想将 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))

我没有遇到任何结果,但已检查是否有完全相同的配对 两个表中的纬度经度。

作为检查,我只加入了纬度,然后加入了经度并得到了结果,所以加入纬度和经度似乎是个问题。

【问题讨论】:

  • 你为什么要转换成浮点数?
  • 我尝试强制转换以避免数据类型错误,但没有人意识到这是不必要的。没有演员表仍然会出现问题

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


【解决方案1】:

加入浮点数是完全错误的做法。如果 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 包中的表示来存储。

【讨论】:

  • +-+ 0.0001 的原因是什么?
  • 我尝试了他们的原生类型,但仍然没有收到结果,但感谢您的第二个建议!我已经将它做到了±0.0000001 lat longs 以确保它们被加入到完全正确的点(我有很多非常接近的 GPS 点)并且加入似乎工作。
【解决方案2】:
select a.*, b.field from table1 a
inner join table2 b
on (a.Latitude = b.Latitude and a.Longitude = b.Longitude)

您不需要强制转换,因为两者都是 Latitude 并且具有相同的数据类型。

【讨论】:

    猜你喜欢
    • 2018-01-24
    • 1970-01-01
    • 2012-01-28
    • 2013-02-08
    • 2017-01-01
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多