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 :

conception : table des dépendances


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Points : 7
    Points
    7
    Par défaut [résolu] conception : table des dépendances
    Bonjour,

    un petit problème de conception...

    Voilà ce que je veux faire : gérer les dépendances entre programmes.
    Exemple : un programme A appelle B, qui lui même appelle C.
    Je veux pouvoir connaître tous les programmes appellant C directement
    ou indirectement. Donc A et B dans mon exemple.

    J'avais pensé à une simple table TAPPEL (APPELLANT, APPELLE), c'est
    simple à remplir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    APPELLANT   APPELLE
    A                 B
    B                 C
    Ensuite la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT APPELLANT                  
    FROM TAPPEL
    WHERE APPELLE   = 'C'
    me ramène seulement B ; pour avoir aussi A je dois faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT APPELLANT                  
    FROM TAPPEL
    WHERE APPELLE   = 'C'      
     
    UNION                             
     
    SELECT APPELLANT                  
    FROM TAPPEL
    WHERE APPELLE IN                  
       ( SELECT APPELLANT             
         FROM TAPPEL
         WHERE APPELLE   = 'C' 
       )
    mais si j'ai plus de 2 niveaux d'appel (ex : C appelle D et je veux connaître
    tous les appellants de D) je dois rajouter encore une UNION et ainsi de suite...

    Bref vous l'aurez compris, je voudrai que tout cela fonctionne quelque soit
    le niveau d'imbrication... Alors une idée ? Une requête qui permet de faire cela ?
    Ou peut-être une table faite différemment ?

    Merci d'avance...

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Trois solutions :
    ORACLE : CONNECT BY
    NORME SQL : WITH RECURSIVE
    AUTRES : Conception intervallaire
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  3. #3
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Bonjour,

    A liste de Médiat j'ajouterais les extensions à Group By
    Group By ROLLUP,
    Group By CUBE ou
    Group By GROUPING SET de DB2

    A +

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Je ne connais pas Group By GROUPING SET de DB2
    mais par contre je connais
    Group By ROLLUP,
    Group By CUBE
    et je ne vois pas en quoi cela peut apporter une aide dans une structure hiérarchique (ce sont deux moyens de calculer des "groupes de groupes"), il me semble que la difficulté est justement de définir les groupes, mais je serais heureux de me tromper .
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Bon déjà merci pour les suggestions.

    Je suis sous DB2.

    J'essaie le RECURSIVE qui me semble assez adapté,
    mais j'ai du mal à faire la requête...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH RECURSIVE TEMP ( APPELLANT ) AS         
    (                                            
    ( SELECT APPELLANT                           
         FROM                                    
         TAPPEL                                  
         WHERE APPELLE = 'C' )            
      UNION                                      
    ( SELECT PP.APPELLANT                        
         FROM TAPPEL PP, TEMP                    
         WHERE PP.APPELLE = TEMP.APPELLANT ) )   
    SELECT DISTINCT APPELLANT                    
    FROM TEMP ;

    me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQLCODE = -104, ERROR:  ILLEGAL SYMBOL "TEMP". SOME SYMBOLS THAT MIGHT
    BE LEGAL ARE: AS

    Vous voyez le problème ??

    Je vais jeter un oeil à ce GROUP BY GROUPING SET sinon...

    La conception intervallaire ca a l'air fort intéressant, mais
    ca va peut être me demander un temps d'apprentissage
    important

  6. #6
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Re,

    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
    WITH RECUR ( APPELLANT ) AS          
    (                                            
    ( 
    SELECT 	APPELLANT                            
    FROM	TAPPEL SRC                                
    WHERE 	SRC.APPELLE = 'C' 
    )         
    UNION ALL                                    
    (
    SELECT 	SRC.APPELLANT                        
    FROM 	RECUR RECUR,
    	TAPPEL SRC                   
    WHERE	RECUR.APPELLANT = SRC.APPELLE
    ) 
    )    
    SELECT DISTINCT APPELLANT                    
    FROM RECUR;    
     
    CONNECT RESET;
    (A vérifier )

  7. #7
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par TheLeadingEdge
    (A vérifier )
    Yes, ca marche !

    Par contre il me met un WARNING car cela peut donner
    une boucle infinie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQLCODE = 347, WARNING:  THE RECURSIVE COMMON TABLE EXPRESSION RECUR
    MAY CONTAIN AN INFINITE LOOP
    Mais bon c'est pas hyper grave...

    Merci beaucoup à tous.

  8. #8
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Citation Envoyé par gregolak
    Merci beaucoup à tous.
    Avec plaisir,
    quant au 'grouping set' je suis en train de m'embarquer ds 1 gros délire, je crois que Médiat à raison.

    A +

  9. #9
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Points : 7
    Points
    7
    Par défaut j'y suis presque...
    Je reviens à la charge...
    J'essaie d'ajouter à ma requête le "niveau
    d'appel"

    Si A appelle B
    Et B appelle C
    Et C appelle D

    que j'interroge avec 'D'
    je voudrais avoir

    tout ca pour pouvoir faire un ORDER BY dans le select global
    et ainsi avoir mes programmes dans le bon ordre...

    Donc je mets 1 dans le 1er sous select mais comment faire pour
    la partie récursive ?? Je suis un peu perdu là...

    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 RECUR ( APPELLANT, NUM ) AS                  
    (                                                 
       (  SELECT APPELLANT, 1                         
            FROM TAPPEL SRC                           
           WHERE SRC.APPELLE = 'D'             
       )                                              
    UNION ALL                                         
       (  SELECT    SRC.APPELLANT, ???                  
            FROM    RECUR   RECUR,                    
                    TAPPEL  SRC                       
           WHERE    RECUR.APPELLANT = SRC.APPELLE     
       )                                              
    )                                                 
    SELECT DISTINCT APPELLANT, NUM                    
    FROM RECUR
    merci d'avance (encore !)

  10. #10
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    ah ben tiens j'ai réussi, voici la réponse :

    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 RECUR ( APPELLANT, PROFONDEUR ) AS                          
    (                                                                
       (  SELECT APPELLANT, 1 AS PROFONDEUR                          
            FROM TAPPEL SRC                                          
           WHERE SRC.APPELLE = 'D '                            
       )                                                             
    UNION ALL                                                        
       (  SELECT    SRC.APPELLANT, RECUR.PROFONDEUR + 1 AS PROFONDEUR
            FROM    RECUR   RECUR,                                   
                    TAPPEL  SRC                                      
           WHERE    RECUR.APPELLANT = SRC.APPELLE                    
       )                                                             
    )                                                                
     
    (...)
    8)

  11. #11
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Re,

    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
    WITH RECUR ( NIVEAU, APPELLANT ) AS          
    (                                            
    ( 
    SELECT 	1,
    	APPELLANT                            
    FROM	TAPPEL SRC                                
    WHERE 	SRC.APPELLE = 'C' 
    )         
    UNION ALL                                    
    (
    SELECT 	RECUR.NIVEAU + 1,
    	SRC.APPELLANT                        
    FROM 	RECUR RECUR,
    	TAPPEL SRC                   
    WHERE	RECUR.APPELLANT = SRC.APPELLE
    ) 
    )    
    SELECT 	NIVEAU,
    	APPELLANT                    
    FROM RECUR;
    A +

  12. #12
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci merci encore !!!

  13. #13
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    en ce qui concerne les requêtes récursives j'ai fait un article complet sur le sujet qui indique comment faire les niveau, chemin,etc... et même éviter la récursivité de SQL. Hélas l'article est en anglais. Mais il paraitra en français dans SQL Server Magazine.

    A lire : http://www.sqlservercentral.com/columnists/fBROUARD/recursivequeriesinsql1999andsqlserver2005.asp

    Bien entendu la version française sera publié sur SQpro.developpez.com avant la fin de cette année.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. [Conception] Enregistrer des tags dans une table ?
    Par Spylberg dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 20/07/2007, 12h54
  2. Réponses: 3
    Dernier message: 23/04/2007, 10h26
  3. [Conception] Tri des tables dans une jointure
    Par Tonio_35 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/07/2006, 15h05
  4. [Conception] Locker des tables
    Par BernardT dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 26/06/2006, 16h39
  5. [Conception] Rerchercher des informations sur une autre table
    Par tilou dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/05/2006, 19h35

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