我正在使用具有以下用于存储IP地址范围的表的应用程序:
IP_RANGE
--------
RANGE_ID primary key
NETWORK_ID foreign key into NETWORK table (not described here)
IP_ID foreign key into IP_ADDRESS table
RANGE_TYPE varchar, values "START" or "END"
IP_ADDRESS
----
IP_ID primary key
IP_NETWORK number (decimal representation of network portion of address)
IP_INTERFACE number (decimal representation of interface portion of address)
给定的IP地址范围由IP_RANGE表中的两行表示:一行的RANGE_TYPE值为“START”,另一行的值为“END”,两者的NETWORK_ID值相同。这些行中的每一行也指向IP_ADDRESS表中存储实际地址的行。
我需要编写一个SELECT语句,它给出了所有NETWORK_ID,它们的IP范围与给定的任意IP范围有任何共同的地址。
我知道如何检查IP_ADDRESS表以查找落在我想要的范围之内或之外的单个地址,但我不知道如何将我的搜索限制为只有具有相同NETWORK_ID的开始/结束对。
(我认为这实际上是一个纯粹的SQL问题,而不是与IP地址有关的任何内容。)
Oracle数据库11g企业版11.1.0.7.0版 - 64位生产
答案 0 :(得分:1)
您需要将IP_RANGE
加入到自身,以通过单个查询获取有关范围开始和范围结束的信息。您还需要将每个IP_RANGE
加入IP_ADDRESS
,以进行IP地址比较;所以,总而言之,你会有这样的事情:
SELECT ip_range_start.network_id
FROM ip_range ip_range_start
JOIN ip_address ip_range_start_address
ON ip_range_start.ip_id = ip_range_start_address.ip_id
JOIN ip_range ip_range_end
ON ip_range_start.network_id = ip_range_end.network_id
JOIN ip_address ip_range_end_address
ON ip_range_end.ip_id = ip_range_end_address.ip_id
WHERE ip_range_start.range_type = 'START'
AND ip_range_end.range_type = 'END'
AND ( ... -- ip_range_start_address less than or equal to end of desired IP range
OR ... -- ip_range_end_address greater than or equal to start of desired IP range
)
;