Многоуровневое отображение (или иерархия дерева) с SQL - PullRequest
0 голосов
/ 06 октября 2018

Моя таблица журнала содержит данные, подобные этим

====================
| src_ip | dest_ip |
====================
| ip01_1 | ip01_2  |
| ip01_1 | ip01_3  |
| ip01_2 | ip01_4  |
| ip01_4 | ip01_5  |
| ip02_1 | ip02_2  |
| ip02_2 | ip02_3  |
====================

Мой требуемый вывод - это таблица, которая содержит dest_ip и первый запрашивающий ip.

Например,* ip01_4 (dest_ip) имеет ip01_1 в качестве first_src_ip (ip01_1 -> ip01_2 -> ip01_4)* ip01_5 (dest_ip) имеет ip01_1 в качестве first_src_ip (ip01_1 -> ip01_2 -> ip01_4 -> ip01_5)

Можно ли использовать SQL-запрос для создания таблицы, как показано ниже?

==========================
| first_src_ip | dest_ip |
==========================
| ip01_1       | ip01_2  |
| ip01_1       | ip01_3  |
| ip01_1       | ip01_4  |
| ip01_1       | ip01_5  |
| ip02_1       | ip02_2  |
| ip02_1       | ip02_3  |
==========================

Я думаю об использовании самосоединения, но время соединения не может быть зафиксировано.

1 Ответ

0 голосов
/ 07 октября 2018

Вот пример, который поддерживает три уровня разделения между узлами, например, ip1 -> ip2, ip2 -> ip3, ip3 -> ip4:

WITH IPs AS (
  SELECT 'ip01_1' AS src_ip, 'ip01_2' AS dest_ip UNION ALL
  SELECT 'ip01_1', 'ip01_3' UNION ALL
  SELECT 'ip01_2', 'ip01_4' UNION ALL
  SELECT 'ip01_4', 'ip01_5' UNION ALL
  SELECT 'ip02_1', 'ip02_2' UNION ALL
  SELECT 'ip02_2', 'ip02_3'
), Hop1 AS (
  SELECT
    COALESCE(
      (SELECT MIN(ip2.src_ip) FROM IPs AS ip2
       WHERE ip.src_ip = ip2.dest_ip),
      src_ip
    ) AS src_ip,
    dest_ip
  FROM IPs AS ip
), Hop2 AS (
  SELECT
    COALESCE(
      (SELECT MIN(ip2.src_ip) FROM IPs AS ip2
       WHERE ip.src_ip = ip2.dest_ip),
      src_ip
    ) AS src_ip,
    dest_ip
  FROM Hop1 AS ip
)
SELECT *
FROM Hop2
ORDER BY src_ip;

Каждый из CTE ищет связь между текущим src_ip и другим dest_ip висходные сопоставления IP-адресов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...