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

SQL Oracle Discussion :

boucle CONNECT BY


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2008
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Janvier 2008
    Messages : 102
    Points : 101
    Points
    101
    Par défaut boucle CONNECT BY
    Bonjour,
    Je vous expose mon problème :
    Je suis en Oracle 9i, et j'ai une base de données avec un table où les données sont hiérarchisées selon le shéma suivant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ID || ID_PARENT || NOM || POSITION
     1 ||      0         || nom || 1
     2 ||      0         || nom || 2
     3 ||      1         || nom || 1
     4 ||      1         || nom || 2
     5 ||      3         || nom || 1
     6 ||      2         || nom || 1
     7 ||      4         || nom || 1
     8 ||      0         || nom || 3
     9 ||      1         || nom || 3
    10 ||      4         || nom || 2
    Ce que je souhaite faire, c'est afficher ma hiérarchie comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ID || ID_PARENT || NOM || POSITION
     1 ||      0         || nom || 1
     3 ||      1         || nom || 1
     5 ||      3         || nom || 1
     4 ||      1         || nom || 2
     7 ||      4         || nom || 1
    10 ||      4         || nom || 2
     9 ||      1         || nom || 3
     2 ||      0         || nom || 2
     6 ||      2         || nom || 1
     8 ||      0         || nom || 3
    Autrement dit, la hiérarchie se fait entre ID_PARENT et ID, et ensuite je souhaite trier par position.
    J'ai testé la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select *
    from MA_TABLE
    start with ID_PARENT=0
    connect by ID_PARENT=prior ID
    order by POSITION
    mais j'ai l'erreur
    boucle CONNECT BY dans les données utilisateur
    J'ai donc pensé à utiliser le mot clef level
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select *
    from MA_TABLE
    start with ID_PARENT=0
    connect by ID_PARENT=prior ID
    order by level||POSITION
    mais j'ai la même erreur. Où est mon erreur ? Je ne trouve pas
    Merci de votre aide

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    CONNECT BY ordornera déjà les données comme vous le désirez.
    Pas besoin de rajouter un ORDER BY :
    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 MaTable AS (
    select 1 id, 0 id_parent, 'nom' nom, 1 position from dual union all
    select  2, 0, 'nom', 2 from dual union all
    select  3, 1, 'nom', 1 from dual union all
    select  4, 1, 'nom', 2 from dual union all
    select  5, 3, 'nom', 1 from dual union all
    select  6, 2, 'nom', 1 from dual union all
    select  7, 4, 'nom', 1 from dual union all
    select  8, 0, 'nom', 3 from dual union all
    select  9, 1, 'nom', 3 from dual union all
    select 10, 4, 'nom', 2 from dual)
    SELECT *
    FROM MaTable
    START WITH ID_PARENT=0
    CONNECT BY PRIOR ID = ID_PARENT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ID	ID_PARENT	NOM	POSITION
    1	0		nom	1
    3	1		nom	1
    5	3		nom	1
    4	1		nom	2
    7	4		nom	1
    10	4		nom	2
    9	1		nom	3
    2	0		nom	2
    6	2		nom	1
    8	0		nom	3

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    l'erreur ORa-01436 vient de tes données, tu as sûrement une entrée qui est le parent de son parent...

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2008
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Janvier 2008
    Messages : 102
    Points : 101
    Points
    101
    Par défaut
    Bonjour,

    L'order by est nécessaire car je ne trie pas sur l'id mais sur la position (qui est indépendante de l'ID)

    Concernant l'erreur dans les données, j'espère bien que non, il s'agit du référentiel Business Objects de nos univers mais je vais vérifier tout de même.

    Je reviens vous voir un peu plus tard pour vous dire si mes données sont nulles ou si j'ai trouvé une solution (ou pas...)

    EDIT : L'erreur disparait quand j'utilise la requête suivante :
    WITH MaTable AS (
    select *
    from ma_table_a_hierarchiser)
    SELECT *
    FROM MaTable
    WHERE ID2=192
    START WITH PARENT_ID=0
    CONNECT BY PRIOR ID = PARENT_ID
    En fait je crois que le problème venait du fait que dans ma table à hiérarchiser, j'ai deux ID, le premier est celui des enregistrements, le champ ID que j'ai nommé dans mes messages, le second qui était fixé dans mon SELECT de ma table. Apparement cela posait problème.

    Pour le tri, il va falloir que je trouve autrement car en fait la position est vrai uniquement dans le niveau et pas dans toute la table.

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    que te donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select *
    from MA_TABLE
    where level=50
    connect by ID_PARENT=prior ID
       and level<=50
       and prior dbms_random.value != dbms_random.value;
    EDIT:
    vu que tu as édité ton message, c'est que tu vu ton erreur...

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

Discussions similaires

  1. couper une connection avec un serveur corba
    Par pons dans le forum CORBA
    Réponses: 3
    Dernier message: 31/05/2002, 10h11
  2. Réponses: 2
    Dernier message: 30/05/2002, 08h54
  3. Réponses: 2
    Dernier message: 29/05/2002, 20h43
  4. Réponses: 3
    Dernier message: 22/05/2002, 09h37
  5. [Kylix] Pb connection à Mysql
    Par Anonymous dans le forum EDI
    Réponses: 3
    Dernier message: 25/04/2002, 15h26

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