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

Langage SQL Discussion :

2 champs père et fils dans la même table


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 22
    Points : 21
    Points
    21
    Par défaut 2 champs père et fils dans la même table
    Bonjour, j'ai deux tables et je dois afficher des infos des deux plus mais j'ai un problème avec la seconde table :

    table mpdem
    num (serial) numcdt (numéro candiat) safnum (numéro de support)

    1 104 1000

    table mpser
    numser (serial) saffnum(numéro de suppor, lien avec mpdem) safppl (numéro de support père)
    1068 1000 0
    1069 4000 1000

    l'enregistrement dont le numéro est 1069 porte a comme safppl 1000 cela veut dire que le support 1068 de saffnum 1000 est son père.

    Voilà l'affichage que j'aimerais obtenir:

    1 1068 1000
    1 1069 4000

    c'est à dire afficher les numéros de supports (safnum) père et fils ainsi que leur numéro de services associés mpser.numser ?

    Je n'arrive à rien de valable quelqu'un peut m'aider ?

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 091
    Points : 31 510
    Points
    31 510
    Billets dans le blog
    16
    Par défaut
    Avec SQL server, on peut essayer quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    with recurs (num, safppl, safnum, numser) as
    (    select b.num, a.safppl, a.safnum, a.numser
         from   mpser a, mpdem b
         where  safppl = 0
           and  a.safnum = b.safnum
     union all
        (select r.num, n.safppl, n.safnum, n.numser
         from   mpser as n, recurs as r 
         where  n.safppl = r.safnum
        )
    )
    Select num, numser, safnum
    from   recurs
    ;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Merci pour ta réponse, je suis sous informix, je vais tester si ça marche.

    A bientôt

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 091
    Points : 31 510
    Points
    31 510
    Billets dans le blog
    16
    Par défaut
    Bonjour Titomiss,

    La requête que je vous ai donnée en exemple correspond à la jointure récursive.

    J'ai l'impression qu'Informix ne propose pas cette facilité. Si vous savez que vous ne dépassez pas la profondeur 2, vous pouvez utilisez une requête du genre de celle qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
         select m.num, s.numser, s.safnum
         from   mpser s, mpdem m
         where  safppl = 0
           and  s.safnum = m.safnum
    UNION all
         Select m.num, s2.numser , s2.safnum
         from   mpdem as m, mpser as s1, mpser as s2
         where  m.safnum = s1.safnum
           and  s1.safnum = s2.safppl ;
    Pour une profondeur maximale de 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
         select m.num, s.numser, s.safnum
         from   mpser s, mpdem m
         where  safppl = 0
           and  s.safnum = m.safnum
    UNION all
         Select m.num, s2.numser , s2.safnum
         from   mpdem as m, mpser as s1, mpser as s2
         where  m.safnum = s1.safnum
           and  s1.safnum = s2.safppl
    UNION all
         Select m.num, s3.numser , s3.safnum
         from   mpdem as m, mpser as s1, mpser as s2, mpser as s3
         where  m.safnum = s1.safnum
           and  s1.safnum = s2.safppl
           and  s2.safnum = s3.safppl ;
    Pour une profondeur maximale de 4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
         select m.num, s.numser, s.safnum
         from   mpser s, mpdem m
         where  safppl = 0
           and  s.safnum = m.safnum
    UNION all
         Select m.num, s2.numser , s2.safnum
         from   mpdem as m, mpser as s1, mpser as s2
         where  m.safnum = s1.safnum
           and  s1.safnum = s2.safppl
    UNION all
         Select m.num, s3.numser , s3.safnum
         from   mpdem as m, mpser as s1, mpser as s2, mpser as s3
         where  m.safnum = s1.safnum
           and  s1.safnum = s2.safppl
           and  s2.safnum = s3.safppl
    UNION all
         Select m.num, s4.numser , s4.safnum
         from   mpdem as m, mpser as s1, mpser as s2, mpser as s3, mpser as s4
         where  m.safnum = s1.safnum
           and  s1.safnum = s2.safppl
           and  s2.safnum = s3.safppl
           and  s3.safnum = s4.safppl ;
    Etc. Je n'ai pas testé les résultats de façon exhaustive.

    Vous pouvez aussi simuler la jointure récursive dans le corps d'un programme, comme dans le bon vieux temps...

    Good luck !

Discussions similaires

  1. [AC-2007] Champs péres et fils dans un formulaire
    Par AgriPhilou dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 19/06/2014, 18h52
  2. [AC-2010] modifier sans bug en même temps SourceObjet, champs père et fils ?
    Par jehhej dans le forum VBA Access
    Réponses: 9
    Dernier message: 23/10/2013, 13h27
  3. [phpMyAdmin] copier un champ vers un autre dans la même table
    Par mtgt_nz dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 20/07/2013, 08h11
  4. Réponses: 2
    Dernier message: 04/01/2010, 10h02
  5. [Requête] plusieurs champs dans une même table ayants la même source
    Par Christophe93250 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 25/04/2006, 16h18

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