比较另一个没有公共密钥的表的值

时间:2014-02-19 18:02:48

标签: sql join range ip-address lookup

我有两个表(SQL)。一个包含IP地址(表a),另一个包含两个表示IP范围结束的字段(表b - range_from和range_to)。这些表中的任何一个都不包含执行连接的公共密钥。我需要根据表a中包含的ip地址从表b中提取国家代码;基于该IP地址在表b中的range_from和range_to中。因此,换句话说,我需要查看表a中的IP所在的范围(表B范围)并提取相应的国家/地区代码。 我尝试过一些东西,但没有运气。关于如何实现这一目标的任何建议/想法?

表a

  

ip地址名称顺序#address country

     
     

255.65.28.214        Carlyle 7458214 45 N. East street United States

表b

  

range_from range_to country_code

     
     

192.168.52.69 192.168.75.11 US

     
     

192.0.78.23 192.0.78.99 CN

1 个答案:

答案 0 :(得分:0)

以下是正式方法:

select a.*, b.country_code
from tablea a join
     tableb b
     on a.ipaddress between b.range_from and range_to;

如果你关心表现,那就有更有效的方法。最有效的是在tableb(range_from, range_to, country_code)上创建索引。然后,如果你假设没有重叠(因为没有)并且第一个表中的所有ip地址都匹配,那么试试:

select a.*,
       (select country_code
        from tableb b
        where b.range_from < a.ipaddress
        order by b.range_from desc
        limit 1
       ) as country_code
from tablea a;

请注意,这使用limit来获取一行。这取决于数据库,可能是topfetch first 1 rows only或其他内容。