Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/12/2006, 14h34   #1
Membre actif
 
Homme Vincent
Ingénieur développement logiciels
Inscription : août 2002
Messages : 237
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Âge : 34
Localisation : France, Meurthe et Moselle (Lorraine)

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

Informations forums :
Inscription : août 2002
Messages : 237
Points : 151
Points : 151
Par défaut Connect by et Branche de taille minimum

Bonjour à tous,

J'aurais besoin de vos lumières pour une requête SQL.

Voici l'énoncé :

Je souhaiterai, via une requête SQL et un Connect by (arbre) récupérer seulement les branches dont il existe au moins 2 niveaux (level 1 et level 2) ?

çà vous semble clair ?
Et si oui, savez-vous comment faire ?

Code :
1
2
SELECT count(*) FROM treleve rel 
start WITH rupture=1 Connect BY RELEVEPRECEDENTE_ID = prior ID
En vous remerciant d'avance.
Cordialement
Boutss
boutss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2006, 17h43   #2
Membre actif
 
Homme Vincent
Ingénieur développement logiciels
Inscription : août 2002
Messages : 237
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Âge : 34
Localisation : France, Meurthe et Moselle (Lorraine)

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

Informations forums :
Inscription : août 2002
Messages : 237
Points : 151
Points : 151
Par défaut 9i

La version de ma base est 9i.

Et c'est peut-être çà mon problème car la version 10 offre les possibilités suivantes :

- NOCYCLE
- CONNECT_BY_ISCYCLE
Le pseudocolumn de CONNECT_BY_ISCYCLE renvoie 1 si la rangée courante a un enfant qui est également son ancêtre. Autrement il renvoie 0
boutss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2006, 08h03   #3
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Un solution mais qui est très couteuse serait une sous requête avec LEVEL > 1
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2006, 11h02   #4
Membre actif
 
Homme Vincent
Ingénieur développement logiciels
Inscription : août 2002
Messages : 237
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Âge : 34
Localisation : France, Meurthe et Moselle (Lorraine)

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

Informations forums :
Inscription : août 2002
Messages : 237
Points : 151
Points : 151
Par défaut Ora-01473

Comme ceci ?

Code :
1
2
AND (SELECT level FROM treleve rel2 CONNECT BY RELEVEPRECEDENTE_ID 
= prior ID) > 1
ORA-01473: cannot have subqueries in CONNECT BY clause

Mais j'ai bien l'impression que l'on ne peut pas faire de sous-requête avec un Connect by
boutss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2006, 11h14   #5
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
ha oui... je ne connaissais pas cette limitation
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2006, 11h27   #6
Membre actif
 
Homme Vincent
Ingénieur développement logiciels
Inscription : août 2002
Messages : 237
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Âge : 34
Localisation : France, Meurthe et Moselle (Lorraine)

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

Informations forums :
Inscription : août 2002
Messages : 237
Points : 151
Points : 151
Par défaut Sys_connect_by_path

Une piste que j'essaie d'étudier est "SYS_CONNECT_BY_PATH(column, char)"
Qui permet de ramener l'ensemble de la branche pour une colonne donnée et un séparateur.

Sinon, à part LEVEL, il n'y a pas l'air d'avoir d'autres fonctionnalités... elles apparaissent, comme je le disais, dans la 10g.
boutss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2006, 11h43   #7
Xo
Expert Confirmé
 
Avatar de Xo
 
Inscription : janvier 2005
Messages : 2 701
Détails du profil
Informations personnelles :
Âge : 38

Informations forums :
Inscription : janvier 2005
Messages : 2 701
Points : 3 237
Points : 3 237
Envoyer un message via Skype™ à Xo
Un exemple existe dans la FAQ : Comment construire une requête récursive ?

SYS_CONNECT_BY_PATH ramène la "concaténation" de l'arborescence, donc tu peux peut-être faire un traitement sur cette chaîne pour récupérer la profondeur en comptant le nombre de séparateur ?
__________________
"Ce que l'on conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément." Nicolas Boileau

"Expliquer empêche de comprendre si cela dispense de chercher"

Quiz Oracle : venez tester vos connaissances !

La FAQ Oracle : 138 réponses à vos questions
Aidez-nous à la compléter
Xo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2006, 12h05   #8
Membre actif
 
Homme Vincent
Ingénieur développement logiciels
Inscription : août 2002
Messages : 237
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Âge : 34
Localisation : France, Meurthe et Moselle (Lorraine)

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

Informations forums :
Inscription : août 2002
Messages : 237
Points : 151
Points : 151
Oui, Merci Xo, c'est ce que je comptais faire, travailler le SYS_CONNECT_BY_PATH.

Fred_D, en fait tu avais raison une sous-requête fait l'affaire mais pas dans la clause du Connect By... mais celle du START WITH

Voilà le résultat qui fonctionne :

Code :
1
2
3
4
5
6
7
SELECT count(*)  FROM treleve rel 
start WITH rupture=1 AND mod(etatobjet, 2)=0 
-- sous requête --
AND (SELECT max(level) FROM treleve rel2 start WITH rel2.id=rel.id 
Connect BY rel2.RELEVEPRECEDENTE_ID = prior rel2.ID AND etatobjet=2 AND statutreleve = 1) > 1 
------------------
Connect BY RELEVEPRECEDENTE_ID = prior ID AND etatobjet=2 AND statutreleve = 1
Edit: la requête m'éliminait la dernière occurence
J'ai supprimé la clause where et tout mis dans la clause du START WITH (plus logique en plus)
boutss est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h46.


 
 
 
 
Partenaires

Hébergement Web