Sql 比较另一个表中没有连接子句的公共键的值

Sql 比较另一个表中没有连接子句的公共键的值,sql,join,range,ip-address,lookup,Sql,Join,Range,Ip Address,Lookup,我有两张表。一个包含IP地址表a,另一个包含两个字段,表示IP范围表b的开始和结束-范围从和范围到。这两个表都不包含执行联接的公用键。我需要根据表a中包含的ip地址从表b中提取国家代码;基于该ip地址在表b中的范围从和范围到。因此,换句话说,我需要查看表a中IP所在的表B范围,并提取对应的国家代码。 我试过几次,但没有成功。关于如何实现这一点,有何建议/想法 表a ip地址名称订单地址国家/地区 255.65.28.214 卡莱尔7458214美国东街北45号 表b 范围从范围到国家/地区代码

我有两张表。一个包含IP地址表a,另一个包含两个字段,表示IP范围表b的开始和结束-范围从和范围到。这两个表都不包含执行联接的公用键。我需要根据表a中包含的ip地址从表b中提取国家代码;基于该ip地址在表b中的范围从和范围到。因此,换句话说,我需要查看表a中IP所在的表B范围,并提取对应的国家代码。 我试过几次,但没有成功。关于如何实现这一点,有何建议/想法

表a ip地址名称订单地址国家/地区

255.65.28.214 卡莱尔7458214美国东街北45号

表b 范围从范围到国家/地区代码

192.168.52.69 192.168.75.11美国

192.0.78.23 192.0.78.99中国


以下是形式化方法:

select a.*, b.country_code
from tablea a join
     tableb b
     on a.ipaddress between b.range_from and range_to;
如果您关心性能,有更有效的方法。最有效的方法是在表brange\u from,range\u to,country\u code上创建索引。然后,如果您假设没有重叠,因为第一个表中没有任何ip地址与您的所有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或仅获取前1行或其他内容