Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL检测重叠的IP地址范围_Sql_Oracle_Oracle11g - Fatal编程技术网

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

使用SQL检测重叠的IP地址范围,sql,oracle,oracle11g,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地址范围的下表:

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地址范围表中的两行表示:一行的范围类型值为“开始”,另一行的值为“结束”,这两行的网络ID值相同。每一行还指向IP地址表中存储实际地址的一行

我需要写一个SELECT语句,它给我所有的网络ID,这些网络ID的IP范围与给定的任意IP范围有共同的地址

我知道如何检查IP地址表以查找在我所需范围之内或之外的各个地址,但我不知道如何将搜索限制为仅具有相同网络ID的开始/结束对

(我想这是一个纯粹的SQL问题,而不是专门针对IP地址的问题。)


Oracle Database 11g Enterprise Edition 11.1.0.7.0版-64位生产版

您需要将
IP_范围
加入到自身中,以通过单个查询获取范围开始和范围结束的信息。您还需要将每次出现的
IP\u范围
加入到
IP\u地址
,以便进行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
       )
;

你能举例说明IP_地址表中的内容吗?这两列是否表示CIDR符号的两部分(例如192.168.1.0/24)?IP_地址表中的一行表示单个IP地址。例如,IP地址1.2.3.4的IP_网络值为258,IP_接口值为772。(我认为该表旨在分别存储网络和接口部分,以提供与IPv4和IPv6地址的兼容性;IPv6地址太大,无法存储为单个整数。)为了更全面地解释,IP_网络值是地址的前16位,IP_接口值是最后16位。(如果使用IPv6范围,则将64替换为16。)