使用SQL检测重叠的IP地址范围

时间:2011-10-25 23:27:16

标签: sql oracle oracle11g

我正在使用具有以下用于存储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位生产

1 个答案:

答案 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
       )
;