【问题标题】:Postgres CIDR. How to select only network w/o subnet?Postgres CIDR。如何只选择没有子网的网络?
【发布时间】:2011-12-29 06:26:35
【问题描述】:

我有一张网络表,网络列表在哪里

-- 表:网

CREATE TABLE net
(
  id serial NOT NULL,
  cidr cidr,
  description text,
  CONSTRAINT net_pkey PRIMARY KEY (id )
)

我需要选择所有没有的网络。属于其他网络。即只有没有子网的网络。如何构建查询?

cidr:
10.0.0.0/8
10.1.0.0/16
10.2.0.0/16
10.3.0.0/16
10.3.1.0/24
10.3.2.0/24
10.3.3.0/24
10.15.1.0/24
10.15.2.0/24
10.15.3.0/24
172.20.0.0/16
172.21.0.0/16
172.0.0.0/8
11.11.11.0/24
评分最高的网络是 10.0.0.0/8、172.0.0.0/8、11.11.11.0/24

【问题讨论】:

    标签: postgresql networking cidr


    【解决方案1】:

    我理解你的问题是这样的: 您希望所有网络规范不包含在任何其他网络规范中,即不属于另一个网络规范。

    试试这个:

    SELECT *
    FROM   net
    WHERE  NOT EXISTS (SELECT cidr FROM net n WHERE n.cidr >> net.cidr);
    

    产生您预期的结果。
    有关>> 运算符的更多信息,请查看手册中的Network Address Functions and Operators 章节。
    使用NOT EXISTS 进行半联接可能是最快的方法。

    【讨论】:

    • 为什么不存在而不是左连接 where condition = null?
    • 在大多数简单的情况下,两种查询样式都会产生相同的查询计划。见:stackoverflow.com/a/19364694/939860
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 2012-04-21
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    相关资源
    最近更新 更多