IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Joindre et rejoindre (jointure récursive ?)


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Septembre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2014
    Messages : 51
    Points : 49
    Points
    49
    Par défaut Joindre et rejoindre (jointure récursive ?)
    Bonjour,

    Le titre est flou mais je ne suis pas certain du terme le plus apte à résumer ma question (d'instinct j'aurais parlé de jointure récursive avec une table, mais je ne sais pas si ça existe).

    Pour résumer ma question, voici une mise en contexte. J'ai 2 tables :
    la première présente des données telles qu'elles sont définies à un instant T
    la seconde présente l'historique de ces données (s'il y en a)

    Pour ceux qui connaissent j'ai en fait un parcellaire de 2010 d'une part (avec l'identifiant parcellaire unique) et la donnée de filiation qui retrace l'évolution de ces parcelles (traîté pour avoir un champ de parcelles mères et un champ de parcelles filles).

    Ce que je voudrais, pour chaque entité de mon cadastre, c'est trouver l'identifiant cadastral de la dernière évolution connue.
    Pour illustrer, voici mes tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    table 1
    parc_2010
    ---------
    A
    C
     
    table 2
    meres  | filles
    -------|--------
    A      | B
    C      | D
    D      | E
    Je voudrais joindre ma table 2 à ma table 1 jusqu'à ce qu'il n'y ait plus de valeurs du champ fille à joindre. Ce qui me donnerais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    parc_2010|derniere_fille
    ---------|--------------
    A        |B
    C        |E
    Est-ce possible dans postgreSQL (j'utilise la version 14 en local sur un PC) ? Si oui, comment est-ce que ça se met en place ?

    D'avance merci pour vos lumières.

    EDIT : Après quelques recherches j'ai trouvé des choses qui semblent parfaitement coller au résultat que je souhaite, et notamment ce type de proposition.
    Seulement voilà, j'ai quelques paramètres qui viennent compliquer tout ça :
    1. une parcelle mère peut avoir plusieurs parcelles filles (division parcellaire) ; et inversement, une parcelle fille peut avoir plusieurs parcelles mères (remembrement)
    2. une parcelle mère (ou un ensemble de parcelles mères) peuvent n'avoir aucune parcelle fille (valeur NULL), correspondant à une disparition de parcelle (versée au domaine public) ; et inversement, une parcelle fille (ou un ensemble de parcelles filles) peuvent n'avoir aucune parcelle mère (valeur NULL), correspondant à une création de parcelle
    3. Dans ma donnée de base j'ai donc 2 champs, meres et filles, composés d'une concaténation de parcelles



    De façon plus détaillée, ma table ressemble donc à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    meres  |  filles
    -------|--------
    A      | B
    C,D    | E
    F      | G,H,I
    H,I    | NULL
    NULL   | A
    Pour compléter ma question, faut-il que je fractionne l'ensemble de mes champs en lignes (j'ai déjà expérimenté la fonction regxp_split_to_table qui fonctionne particulièrement bien) pour faire une jointure récursive ou existe-t-il un moyen de faire une jointure en cherchant une chaîne de caractères dans un entité par exemple ?

    D'avance merci.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    bonjour,

    À partir du moment où au niveau conceptuel, on a une association de cardinalité maximale n de part et d'autre, on doit avoir au niveau SQL une table associative dont la PK est constituée des identifiants issus des entités-types concourant à l'association.

    Dans votre cas, il s'agit d'une association reflexive n-aire de l'entité-type [PARCELLE]

    On aura donc une table issue de l'entité-type [PARCELLE] ayant pour PK PA_ident par exemple, et une table issue de l'association qui aura pour PK le couple (PA_ident_parent, PA_ident_enfant)

    Ce qui pemettra de s'affranchir de cette colonne contenant une liste de valeurs, qui constitue une hérésie de modélisation (viol de la 1re forme normale) !

    Voici le MCD

    Nom : MCD.png
Affichages : 100
Taille : 23,5 Ko


    et le MLD correspondant

    Nom : MLD.png
Affichages : 94
Taille : 33,6 Ko

    À partir de là, les requêtes seront très simples.

Discussions similaires

  1. [PostgreSQL] Format d'attribut pour auto-jointure récursive
    Par MaitrePylos dans le forum Langage SQL
    Réponses: 11
    Dernier message: 15/06/2019, 18h21
  2. Réponses: 3
    Dernier message: 03/03/2010, 19h05
  3. sommets d'une jointure récursive
    Par cdu dans le forum SQL
    Réponses: 9
    Dernier message: 29/04/2009, 12h55
  4. rejoindre des tables liée par jointure
    Par guy88 dans le forum Modélisation
    Réponses: 3
    Dernier message: 28/08/2007, 11h11
  5. Réponses: 4
    Dernier message: 11/10/2005, 10h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo