2011-11-15 4 views
1

J'ai un filet de table où est la liste des réseauxPostgres CIDR. Comment sélectionner uniquement le réseau sans sous-réseau?

- Tableau: net

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

je dois sélectionner tous les réseaux qui ne sont pas. appartiennent à d'autres réseaux. c'est-à-dire seulement réseau sans sous-réseaux. Comment créer une requête?

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
Top net est évalué 10.0.0.0/8, 172.0.0.0/8, 11.11.11.0/24

Répondre

3

Je comprends votre question comme ceci: Vous voulez toutes les spécifications de réseau qui ne sont pas contenues dans une autre spécification de réseau, c'est à dire ne font pas partie du sous-réseau d'une autre.

Essayez ceci:

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

Produit le résultat attendu.
Consultez le chapitre Network Address Functions and Operators dans le manuel pour en savoir plus sur l'opérateur >>.
Semi-rejoindre avec NOT EXISTS est probablement le moyen le plus rapide de le faire.

Questions connexes