Использование SQL для обнаружения перекрывающихся диапазонов IP-адресов - PullRequest
0 голосов
/ 26 октября 2011

Я работаю с приложением, в котором имеются следующие таблицы для хранения диапазонов 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 Database 11g Enterprise Edition Release 11.1.0.7.0- 64-битное производство

1 Ответ

1 голос
/ 26 октября 2011

Вам необходимо присоединить 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
       )
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...