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

DB2 Discussion :

SQL Père et Fils - Récursif, yes or no ?


Sujet :

DB2

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2015
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2015
    Messages : 95
    Points : 68
    Points
    68
    Par défaut SQL Père et Fils - Récursif, yes or no ?
    Bonjour,

    Je voudrai savoir si une requête peut me sortir une hiérarchie sur un code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     Cmp  Fac  tp   Product no       Component no   
     100  901  CLT  7                72             
     100  901  CLT  72               72001          
     100  901  CLT  72001            72001001
    J'ai dans une table T, un N° de composant qui à la base fait 72001001 qui correspond au produit 72001.
    Ce même produit est aussi un composant du produit 72 qui lui même est composant du produit 7.

    Je pense que seule la récursivité peut extraire les lignes. J'avoue ne pas être fan de la syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH
    nomDeLaTableTemporaire (champ1, champ2, champ3, ...) AS
    (
    SELECT d'initialisation
    UNION ALL
    SELECT de récursion
    )
    SELECT de résultat
    Qqn aurait il eut le même cas ?

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    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 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    Bonjour

    Sur le principe je ne vois pas de souci particulier, sous réserve que vous trouviez un moyen d'identifier le composant de niveau le plus haut :
    Comment savez vous qu'une produit n'est pas lui même un composant ?
    J'immagine que les identifiants que vous avez donnés ne sont qu'à titre d'exemple, et que ce n'est évidemment pas la longueur de l'id qui permet de savoir ce qu'il en est

    Par exemple dans la requête ci-dessous, avec une table comportant les colonnes (ident, nom, prénom, courriel, id_manager)
    j'identifie le patron par le fait qu'il n'ait pas d'identifiant manager, (ZZIDMGR = 0)

    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
    23
    24
    25
    26
    27
    28
    WITH CTE(TTLEVEL, TTIDMGR, TTNMMGR, TTPRMGR,      
                      TTIDEMP, TTNMEMP, TTPREMP)      
      AS (                                            
    -- 1ère invocation : niveau 0 = pas de chef       
          SELECT 0    AS TTLEVEL                      
                ,0                                    
                ,''                                   
                ,''                                   
                ,ZZIDENT                              
                ,SUBSTR(ZZNMPAT, 01, 10)              
                ,SUBSTR(ZZPRPAT, 01, 10)              
          FROM   MONSCHEM.MATABLE                      
          WHERE  ZZIDMGR = 0                          
          UNION ALL                                   
    -- itération                                       
          SELECT CHEF.TTLEVEL+1                        
                ,EMPL.ZZIDMGR                          
                ,CHEF.TTNMEMP                          
                ,CHEF.TTPREMP                          
                ,EMPL.ZZIDENT                          
                ,SUBSTR(EMPL.ZZNMPAT, 01, 10)          
                ,SUBSTR(EMPL.ZZPRPAT, 01, 10)          
          FROM   CTE AS CHEF                           
          INNER JOIN  MONSCHEM.MATABLE AS EMPL         
             ON EMPL.ZZIDMGR = CHEF.TTIDEMP            
    -- condition d'arrêt obligatoire sinon SQLCODE +347
          WHERE CHEF.TTLEVEL < 9                       
         )

  3. #3
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2015
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2015
    Messages : 95
    Points : 68
    Points
    68
    Par défaut
    Merci escartefigue pour ta réponse J'ai essayé de l'adapter, sans succès pour l'instant car j'ai une erreur SQL0104 ( Élément syntaxique <FIN-INSTRUCTION> n'est pas correct) et je ne sais pas d'ou ça vient

    Ma table ZCHLV00 est unique elle contient composant et composé
    Si on prend pour champ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ZSCONO   ZSFACI   ZSPRNO       ZSMTNO
      (3N)      (3A)    (10A)         (10A)
     100        901    7                   72            
     100        901    72               72001    
     100        901    72001         72001001

    ZSPRNO sur 1 caractère ici 7 est le produit de plus haut level et j'arrive avec le composé le +long 72001001
    Il existe les produits de 1 à 7 avec la même logique 1_>12, 12->12001 , 12001->12001001....mais pas toujours .
    Du coup ma sélection de base se fait sur la longueurs de 1 caractère

    La requête que j'ai faite (et qui me retourne l’erreur):

    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
    WITH                                                               
    ZCHSLV00(ZSCONO, ZSFACI, ZSPRNO , ZSMTNO)                          
    AS (                                                               
    SELECT ZSCONO, ZSFACI, ZSPRNO , ZSMTNO                             
    FROM ZCHSLV00 WHERE                                                
    CHARACTER_LENGTH(RTRIM(ZSPRNO)) =1 AND                             
    ZSCONO=100 AND ZSFACI='901'                                        
    UNION ALL                                                          
    SELECT ZSCONO, ZSFACI, 
    CAST(SUBSTR(CHEF.ZSPRNO, 1, 1) AS INTEGER) +1 , 
    CHEF.ZSMTNO FROM ZCHSLV00 AS CHEF                              
     
    INNER JOIN ZCHSLV00 AS EMPL ON                                     
              EMPL.ZSPRNO=CHEF.ZSMTNO WHERE CHEF.ZSPRNO < 8  AND       
               ZSCONO=100 AND ZSFACI='901')

    Je retourne à la mine, si qqn trouve je lui élèverai un autel et si je trouve je ferai un beau post!
    @+

  4. #4
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    Bonjour

    ta requête est incomplète!

    pour aider, regarde les exemples donnés ici: Examples of recursive common table expressions, il y a un exemple qui correspond à ton besoin.

  5. #5
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2015
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2015
    Messages : 95
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par bernard59139 Voir le message
    Bonjour

    ta requête est incomplète!

    pour aider, regarde les exemples donnés ici: Examples of recursive common table expressions, il y a un exemple qui correspond à ton besoin.

    MERCI!!!!!!!!!!
    Pour le lien à bernard59139 et à escartfigue pour la structure du with.
    Je vous mettrai dans le panthéon de mes sauveurs

    C'est effectivement exactement mon cas, mais à l'envers, l'exemple du lien IBM part du père au fils et moi c'était l'inverse.
    Donc inversement des donnée et de la requête.

    La table de départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ZSPRNO             ZCHSLV00           CHARACTER                15        
    ZSMTNO             ZCHSLV00           CHARACTER                15
    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ZSPRNO       ZSMTNO
     (15A)         (15A)
     7                   72            
     72               72001    
     72001         72001001

    Pour le SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH RPL (ZSMTNO, ZSPRNO) AS            
    (SELECT ROOT.ZSMTNO, ROOT.ZSPRNO        
    FROM ZCHSLV00 ROOT                      
    WHERE ROOT.ZSMTNO = '72001001'          
    UNION ALL                               
    SELECT CHILD.ZSMTNO, CHILD.ZSPRNO       
    FROM RPL PARENT, ZCHSLV00 CHILD         
    WHERE PARENT.ZSPRNO = CHILD.ZSMTNO)     
    SELECT DISTINCT ZSPRNO, ZSMTNO          
    FROM RPL                                
    ORDER BY ZSPRNO, ZSMTNO
    Voilà ce que j'ai pondu, mais dieu que ça à fait mal...Celle là je vais me la mettre de côté!

    Merci encore à vous 2!

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    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 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par totofff78 Voir le message
    MERCI!!!!!!!!!!
    Pour le lien à bernard59139 et à escartfigue pour la structure du with.
    Je vous mettrai dans le panthéon de mes sauveurs
    C'est bien la première fois que j'obtiens une telle promotion, merci
    Mais si ca pouvait attendre un peu pour le panthéon, j'ai pas prévu de passer l'arme à gauche tout de suite

  7. #7
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    Etre au pinacle du temple pour une petite requete, c'est bien payé.. Je vais en parler à mon employeur.
    Perso, le recursif j'ai abandonné il y a .. ans.
    a+

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    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 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par bernard59139 Voir le message
    Perso, le recursif j'ai abandonné il y a .. ans.
    En même temps, pour extraire une hiérarchie ou une nomenclature composant/composé, difficile de faire sans

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. 2 champs père et fils dans la même table
    Par titomiss dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2007, 17h18
  2. Gestion de signaux, pères et fils
    Par Darkeagle33 dans le forum C
    Réponses: 12
    Dernier message: 15/06/2007, 16h00
  3. Treeview et tables avec 2 champs Père et fils
    Par BEN NASR dans le forum Delphi
    Réponses: 4
    Dernier message: 14/05/2007, 17h48
  4. Réponses: 8
    Dernier message: 09/11/2006, 15h01
  5. Père et fils sous-formulaire
    Par manujuggler dans le forum Access
    Réponses: 7
    Dernier message: 05/01/2006, 17h20

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