Sql 比较另一个表中没有连接子句的公共键的值
我有两张表。一个包含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中国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 范围从范围到国家/地区代码
以下是形式化方法:
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行或其他内容