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 :

Connect by prior avec un order by


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2007
    Messages : 165
    Par défaut Connect by prior avec un order by
    Bonjour,

    Je souhaite effectuer le tri par code d'une liste de données récursivement de la manière suivante :

    0 : parent 1
    -----2 : fils 1.1
    -----2 : fils 1.2
    3 : parent 2
    -----4 : fils 2.1
    -----5 : fils 2.2

    Actuellement ça me remonte les données triés de manière aléatoire et non triés par code:

    3 : parent 2
    -----5 : fils 2.1
    -----4 : fils 2.2
    0 : parent 1
    -----2 : fils 1.1
    -----2 : fils 1.2

    Voici la requête que j'ai utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT
            level,
            ID,
            CODE,
            ID_PARENT,
        FROM
            DEPT START WITH ID in (44973)  CONNECT 
        BY
            PRIOR ID= ID_PARENT
    Et l'essai que j'ai fait sans résultat cohérent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       SELECT
            level,
            ID,
            CODE,
            ID_PARENT,
        FROM
            DEPT START WITH ID in (44973)  CONNECT 
        BY
            PRIOR ID= ID_PARENT
            ORDER BY CODE
    Pouvez-vous m'aider s'il vous plait ?

    Merci.

    Cordialement.

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    hierarchical_query_clause
    If you specify this clause, then do not specify either ORDER BY or GROUP BY, because they will destroy the hierarchical order of the CONNECT BY results. If you want to order rows of siblings of the same parent, then use the ORDER SIBLINGS BY clause

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2007
    Messages : 165
    Par défaut
    Bonjour,

    Merci pour votre réponse,

    J'ai fait cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT
            level,
            ID,
            CODE,
            ID_PARENT,
        FROM
            DEPT START WITH ID IN (44973)  CONNECT 
        BY
            PRIOR ID= ID_PARENT
            ORDER SIBLINGS BY CODE
    Et toujours le même résultat.

    Ai-je oublié quelque chose svp ?

    Merci.

    Cordialement.

    Edit : Pour information le CODE est un VERCHAR qui a comme valeur des nombres entier.

  4. #4
    Membre éprouvé
    Inscrit en
    Septembre 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 82
    Par défaut
    C'est une assez mauvaise idée de stocket des nombres dans des VARCHAR2. Surtout si tu dois trier sur cette colonne.

    Regarde ceci:

    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
     
    WITH t AS (
      SELECT '1' as c FROM dual UNION ALL
      SELECT '20' FROM dual UNION ALL
      SELECT '11' FROM dual UNION ALL
      SELECT '2' FROM dual
    ) 
    SELECT c
      FROM t
     ORDER BY c;
     
    C
    --
    1  
    11 
    2  
    20 
     
     
    SELECT c
      FROM t
     ORDER BY TO_NUMBER(c);
     
    C
    --
    1  
    2  
    11 
    20 
     
    SELECT c
      FROM t
     ORDER BY LPAD(c, 3, '0');
     
    C
    --
    1  
    2  
    11 
    20


    Je pense que ce doit être là ton problème. Sinon, poste nous un exemple de données. Avec des données aléatoire générées, j'ai le tri correctement effectué

    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
    CREATE TABLE faux_dept
    (
      id NUMBER(15), 
      code VARCHAR2(10), 
      id_parent NUMBER(15)
    );
     
    INSERT INTO faux_dept(id, code, id_parent) 
      SELECT LEVEL, 
             TO_CHAR(TRUNC(dbms_random.value(1, 10000000))), 
             TRUNC(dbms_random.value(1, LEVEL))
        FROM dual
      CONNECT BY level <= 1000;
     
    COMMIT;
     
    SELECT level, id, code, id_parent
      FROM faux_dept
     START WITH id = 1
    CONNECT BY NOCYCLE PRIOR id = id_parent
     ORDER SIBLINGS BY LPAD(code, 11, '0');

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2007
    Messages : 165
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    Le code dept peut avoir des numéros et des lettres et je ne peux pas me permettre de créer des données en base même temporairement

    Il n y aurait-il pas des fonctions de tri fournit par Oracle ?

    Merci.

  6. #6
    Membre éprouvé
    Inscrit en
    Septembre 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 82
    Par défaut
    Sérieux Chabanus, tu nous demandes de t'aider à trier des données sans nous montrer ces données. Comment veux-tu que nous t'aidions?

Discussions similaires

  1. Requête SQL avec CONNECT BY prior
    Par guappi dans le forum Zend_Db
    Réponses: 2
    Dernier message: 03/03/2008, 14h24
  2. quel équivalent de start with...connect by prior en DB?
    Par Mittou dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/10/2005, 14h02
  3. Se connecter à internet avec un sagem fast@800
    Par bakonu dans le forum Réseau
    Réponses: 7
    Dernier message: 28/03/2004, 16h57
  4. Probleme avec un "order by"
    Par LineLe dans le forum ASP
    Réponses: 30
    Dernier message: 16/09/2003, 15h38
  5. Connecter un serveur avec ADSL et RTC
    Par Sunny dans le forum Développement
    Réponses: 7
    Dernier message: 09/09/2002, 11h15

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