【发布时间】:2013-05-11 05:56:03
【问题描述】:
我有一个网络中的大量子网列表,存储在以下布局中。这用作存储资产的主表,这些资产将用于定期通过 Python 脚本自动探测状态。
CREATE TEMP TABLE tmp_networks (
network cidr PRIMARY KEY
);
为了演示,假设它填充了这些值:
- 10.0.0.0/8
- 10.0.1.0/24
- 192.168.0.0/24
当我运行脚本时,Python 脚本将执行以下查询以删除任何重叠:
SELECT network
FROM tmp_networks
WHERE NOT EXISTS (
SELECT network
FROM tmp_networks n
WHERE n.network >> tmp_networks.network
);
这很好用,除了一个小问题;我还有一份应从工作中排除的个人地址列表。这也是数据库中的一个表:
CREATE TEMP TABLE tmp_except (
address inet PRIMARY KEY
);
假设它包含以下地址:
- 10.0.0.100
- 192.168.0.10
现在,我找不到从数据库输出中删除这些特定地址的好方法。在我看来,解决方案是这样的:
- 选择所有子网
- 如果在子网中发现任何异常地址,则将子网拆分为更小的部分,直到可以删除单个异常地址并保留所有其他地址
我曾尝试调查在纯 PostgreSQL 中是否可以执行此类操作,但未能找到解决此问题的任何方法。关于如何解决这个问题的任何指示?
【问题讨论】:
-
您期望查询的结果是什么?它总是地址(/32)还是网络地址(如果可能)和仅地址(如果有异常)?
-
嗨,如果可能,我除了网络地址之外,如果不存在更大的块,我将排除 /32。
标签: postgresql cidr