我有两个表(SQL)。一个包含IP地址(表a),另一个包含两个表示IP范围结束的字段(表b - range_from和range_to)。这些表中的任何一个都不包含执行连接的公共密钥。我需要根据表a中包含的ip地址从表b中提取国家代码;基于该IP地址在表b中的range_from和range_to中。因此,换句话说,我需要查看表a中的IP所在的范围(表B范围)并提取相应的国家/地区代码。 我尝试过一些东西,但没有运气。关于如何实现这一目标的任何建议/想法?
ip地址名称顺序#address country
255.65.28.214 Carlyle 7458214 45 N. East street United States
range_from range_to country_code
192.168.52.69 192.168.75.11 US
192.0.78.23 192.0.78.99 CN
答案 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
来获取一行。这取决于数据库,可能是top
或fetch first 1 rows only
或其他内容。