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 :

Self Referencing Table


Sujet :

DB2

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 78
    Par défaut Self Referencing Table
    Je dispose d'une table avec une PK qui a une FK sur elle-même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE TABLE STAR.CATEGORIE_ARTISTIQUE (
     NS_CAT_ARTISTIQUE_ID INTEGER NOT NULL ,
     TE_NOM VARCHAR(100) ,
     NS_PARENT_AT_ARTISTIQUE_ID INTEGER ,
     TE_CO_TYPE_FORMULAIRE VARCHAR(100) NOT NULL ,
     TS_MISE_A_JOUR TIMESTAMP NOT NULL ,
     TE_MISE_A_JOUR VARCHAR(30) NOT NULL ,
     TS_CREATION TIMESTAMP NOT NULL ,
     TE_CREATION VARCHAR(30) NOT NULL ,
        PRIMARY KEY (NS_CAT_ARTISTIQUE_ID ) ,
        FOREIGN KEY CATART1 (NS_PARENT_CAT_ARTISTIQUE_ID )
        REFERENCES STAR.CATEGORIE_ARTISTIQUE ON DELETE CASCADE )
     IN  STARDB01.CATART
    Je suis en train de faire des tests pour une requête hiérarchique, pourriez vous regarder ce qui fait que la première requête sql fonctionne correctement, mais la deuxième ne se termine jamais ... hors il y a maximum 50 records dans la table ...

    -- OK ==> renvoit le premier niveau de ma hiérarchie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH n( NS_CAT_ARTISTIQUE_ID , NS_PARENT_AT_ARTISTIQUE_ID) AS
               (SELECT NS_CAT_ARTISTIQUE_ID, NS_PARENT_AT_ARTISTIQUE_ID
                  FROM STAR.CATEGORIE_ARTISTIQUE
                  WHERE NS_PARENT_AT_ARTISTIQUE_ID IS NULL
                UNION ALL
                SELECT nplus1.NS_CAT_ARTISTIQUE_ID, nplus1.NS_PARENT_AT_ARTISTIQUE_ID
                  FROM STAR.CATEGORIE_ARTISTIQUE as nplus1, n
                  WHERE n.NS_PARENT_AT_ARTISTIQUE_ID = nplus1.NS_PARENT_AT_ARTISTIQUE_ID)
     SELECT NS_CAT_ARTISTIQUE_ID, NS_PARENT_AT_ARTISTIQUE_ID FROM n;
    -- NOT OK , ne se termine jamais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH n( NS_CAT_ARTISTIQUE_ID , NS_PARENT_AT_ARTISTIQUE_ID) AS
               (SELECT NS_CAT_ARTISTIQUE_ID, NS_PARENT_AT_ARTISTIQUE_ID
                  FROM STAR.CATEGORIE_ARTISTIQUE
                  WHERE NS_PARENT_AT_ARTISTIQUE_ID =1000
                UNION ALL
                SELECT nplus1.NS_CAT_ARTISTIQUE_ID, nplus1.NS_PARENT_AT_ARTISTIQUE_ID
                  FROM STAR.CATEGORIE_ARTISTIQUE as nplus1, n
                  WHERE n.NS_PARENT_AT_ARTISTIQUE_ID = nplus1.NS_PARENT_AT_ARTISTIQUE_ID)
     SELECT NS_CAT_ARTISTIQUE_ID, NS_PARENT_AT_ARTISTIQUE_ID FROM n;
    Autre question : conseillez vous un DELETE CASCADE ? Quel est le risque ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    si une requête récursive ne se termine pas, c'est qu'elle boucle sur elle même.

    Dons sans jeu de donnée on ne pourra pas vous aider.

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 78
    Par défaut
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    NS_CAT_ARTISTIQUE_ID;TE_NOM;NS_PARENT_CAT_ARTISTIQUE_ID
    1000;Cirque, arts forains et de la rue;(null)
    1001;Tout public;1000
    1002;Jeune public (Théâtre à lécole  jeune public);1000
    1003;Conte, poésie et littérature;(null)
    1004;Conte tout public;1004
    1005;Conte jeune public (Théâtre à lécole  jeune public);1004
    1006;Poésie et littérature;1004
    1007;Danse;(null)
    1008;Contemporaine;1007
    1009;Folklorique;1007
    1010;Jeune public (Théâtre à lécole  jeune public);1007
    1011;Urbaine;1007
    1012;Musique ;(null)
    1013;Musique classique professionnelle;1012
    1014;Musique médiévale;1013
    1015;Musique renaissance;1013
    1016;Musique baroque/ancienne;1013
    1017;Musique classique/romantique;1013
    1018;Musique fin 19ème/début 20ème siècle;1013
    1019;Musique contemporaine;1013
    1020;Musique non classique;1012
    1021;Blues;1020
    1022;Chanson;1020
    1023;Chanson jeune public (Chanson à lécole  jeune public);1020
    1024;Musique insolite;1020
    1025;Jazz;1020
    1026;Musiques du monde;1020
    1027;Rock;1020
    1028;Pop-rock;1027
    1029;Rock dur;1027
    1030;Electro;1027
    1031;Autre genre rock;1027
    1032;Musique urbaine, hip hop;1020
    1033;Sociétés musicales amateurs (Sociétés Musicales  SM);1012
    1034;Chorales;1033
    1035;Fanfares;1033
    1036;Harmonies;1033
    1037;Autres ensembles damateurs;1033
    1038;Pluridisciplinaire;(null)
    1039;Spectacle musical;1038
    1040;Spectacle musical jeune public (Théâtre à lécole  jeune public);1038
    1041;Spectacle pluridisciplinaires;1038
    1042;Spectacle pluridisciplinaire jeune public (Théâtre à lécole  jeune public);1038
    1043;Théâtre ;(null)
    1044;Théâtre adulte;1043
    1045;Théâtre action;1044
    1046;Théâtre dialectal;1044
    1047;Théâtre adulte général;1044
    1048;Théâtre de marionnettes, dobjets ou dombres pour adultes;1044
    1049;Théâtre pour lenfance et la jeunesse (Théâtre à lécole  jeune public);1043
    1050;Théâtre action jeune public;1049
    1051;Théâtre général jeune public;1049
    1052;Théâtre de marionnettes, dobjets ou dombres pour jeune public;1049

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Bonjour,


    Que voulez-vous faire avec cette requête ?

    Car je penses que vos 2 requêtes sont fausse en fait.

    est-ce que cette requête vous ramène le résultat souhaité ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH n( NS_CAT_ARTISTIQUE_ID , NS_PARENT_AT_ARTISTIQUE_ID) AS
               (SELECT NS_CAT_ARTISTIQUE_ID, NS_PARENT_AT_ARTISTIQUE_ID
                  FROM STAR.CATEGORIE_ARTISTIQUE
                  WHERE NS_PARENT_AT_ARTISTIQUE_ID =1000
                UNION ALL
                SELECT nplus1.NS_CAT_ARTISTIQUE_ID, nplus1.NS_PARENT_AT_ARTISTIQUE_ID
                  FROM STAR.CATEGORIE_ARTISTIQUE AS nplus1, n
                  WHERE n.NS_PARENT_AT_ARTISTIQUE_ID = nplus1.NS_AT_ARTISTIQUE_ID)
     SELECT NS_CAT_ARTISTIQUE_ID, NS_PARENT_AT_ARTISTIQUE_ID FROM n;

    En fait avec vos requête vous bouclez à cause de votre close
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     WHERE n.NS_PARENT_AT_ARTISTIQUE_ID = nplus1.NS_PARENT_AT_ARTISTIQUE_ID
    Ici vous devriez référencer la clef AT_ARTISTIQUE et non parent pour le nplus1 si je ne m'abuse ?

  5. #5
    Membre Expert Avatar de bernard59139
    Profil pro
    Retired
    Inscrit en
    Octobre 2006
    Messages
    966
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retired

    Informations forums :
    Inscription : Octobre 2006
    Messages : 966
    Par défaut
    BONJOUR

    il n'y a pas d'arrêt aux 2 requetes.

    Si la 1ere fonctionne, ce n'est que de la chance.
    Il est même étonnant que db2 laisse passer cela.

    DE RIEN
    Au REVOIR

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/04/2014, 17h04
  2. [2.x] Doctrine: Self-referencing ou Tree
    Par etoileweb dans le forum Symfony
    Réponses: 0
    Dernier message: 14/07/2013, 17h57
  3. Réponses: 2
    Dernier message: 07/03/2012, 16h15
  4. Code VB6 pour referencer deux tables dans un formulaire
    Par mianiser dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 04/02/2011, 14h28
  5. "self-referencing" + TRIGGER => table
    Par hair_peace dans le forum Oracle
    Réponses: 8
    Dernier message: 18/07/2005, 11h42

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