# Connect by

**URL:** <https://www.debian-fr.org/t/connect-by/35154>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 3:55 UTC](https://www.debian-fr.org/t/connect-by/35154 "2016-02-21T03:55:52Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![debianhadic](https://www.debian-fr.org/user_avatar/www.debian-fr.org/debianhadic/32/3870_2.png) [@debianhadic](https://www.debian-fr.org/u/debianhadic)\
**Post date:** [Février 21, 2016, 3:55 UTC](https://www.debian-fr.org/t/connect-by/35154/1 "2016-02-21T03:55:52Z")

</div>

Bonjour,  
Je cherche désespérément un bon tuto pour m’expliquer comment utiliser cette instruction ORACLE.  
Je suis sur que ça répondrait à mon besoin, mais je ne sais pas l’utiliser !

Un tuto, un exemple, 1€, un ticket restaurant, enfin tout est bienvenue !

---

<div class="post-metadata">

**Author:** ![tetrix](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/a4c791/32.png) [@tetrix](https://www.debian-fr.org/u/tetrix)\
**Post date:** [Février 21, 2016, 3:55 UTC](https://www.debian-fr.org/t/connect-by/35154/2 "2016-02-21T03:55:52Z")

</div>

Salut,

j’ai trouvé ça [la version en Anglais](http://psoug.org/reference/connectby.html) , sinon traduit viteuf par google :

[code]Syntaxe 1 CONNECT BY [NOCYCLE] COMMENCER AVEC   
Syntaxe 2 COMMENCER AVEC CONNECT BY [NOCYCLE]

CONNECT PAR NIVEAU  
Une condition qui identifie la relation entre les rangées et des rangées parent enfant de la hiérarchie CONNECT BY \<child\_value\> = \<parent\_value\>  
conn uwclass / uwclass

CREATE TABLE t (  
NOMBRE débarrasser (12),  
col1 VARCHAR2 (30),  
col2 VARCHAR2 (300));

CREATE SEQUENCE seq\_t\_rid;

INSERT INTO t  
SELECT seq\_t\_rid.NEXTVAL, dbms\_crypto.randombytes (15), dbms\_crypto.randombytes (150)  
FROM DUAL  
CONNECT BY LEVEL \<= 1000;

CONNECT BY PRIOR  
Une condition qui identifie la relation entre les rangées et des rangées parent enfant de la hiérarchie CONNECT BY \<child\_value\> = \<parent\_value\>  
conn hr / hr

SELECT employe\_id, last\_name, manager\_id  
FROM employés  
CONNECT BY PRIOR = employe\_id manager\_id;

DÉBUT DE

Indique une condition qui identifie la ligne (s) d’être utilisé comme racine (s) d’une start requête hiérarchique avec (nom\_colonne) =   
conn hr / hr

SELECT nom, employe\_id, manager\_id, NIVEAU  
FROM employés  
DÉBUT DE employe\_id = 100  
CONNECT BY PRIOR = employe\_id manager\_id;

SELECT nom, employe\_id, manager\_id, NIVEAU  
FROM employés  
DÉBUT DE employe\_id = 101  
CONNECT BY PRIOR = employe\_id manager\_id;

mis pagesize 0  
format de last\_name col A30

SELECT LEVEL, LPAD (’’, \* niveau 3) | | LAST\_NAME AS LAST\_NAME  
FROM employés  
DÉBUT DE employe\_id = 100  
CONNECT BY PRIOR = employe\_id manager\_id;

mis pagesize 20

FRÈRES ET SOEURS ORDER BY  
Frères et sœurs par préserve toute commande spécifiée dans la clause requête hiérarchique et applique ensuite l’order\_by\_clause aux frères et sœurs de la fratrie ORDER BY hiérarchie (nom\_colonne)  
conn hr / hr

SELECT nom, employe\_id, manager\_id, NIVEAU  
FROM employés  
DÉBUT DE employe\_id = 100  
CONNECT BY PRIOR = employe\_id manager\_id  
FRÈRES ET SOEURS ORDER BY last\_name;

CONNECT\_BY\_ROOT

CONNECT\_BY\_ROOT est un opérateur unaire qui n’est valide que dans les requêtes hiérarchiques. Lorsque vous vous qualifiez d’une colonne avec cet opérateur, Oracle retourne la valeur de colonne en utilisant les données de la rangée racine.

Ne peut pas être spécifiée avec le début avec CONNECT BY ou condition. L’exemple suivant retourne le nom de famille de chaque employé dans le département 110, chaque gestionnaire supérieur à celui employé dans la hiérarchie, le nombre de niveaux entre le gestionnaire et l’employé, et le chemin entre les deux:  
conn hr / hr

ensemble linesize 121  
a20 col de format PEM  
a20 col format de mgr

SELECT last\_name  
FROM employés  
OÙ departement\_id = 110;

SELECT nom, last\_name CONNECT\_BY\_ROOT MGR,  
NIVEAU-1 PATHLEN, SYS\_CONNECT\_BY\_PATH (last\_name, ‘/’) PATH  
FROM employés  
Lorsque le niveau\> 1  
ET departement\_id = 110  
CONNECT BY PRIOR = employe\_id manager\_id  
ORDER BY last\_name, MGR, PATHLEN, PATH;

CONNECT\_BY\_ISCYCLE pseudo-

Le pseudo-CONNECT\_BY\_ISCYCLE retourne 1 si la ligne actuelle a un enfant qui est aussi son ancêtre. Sinon, elle renvoie 0  
conn hr / hr

UPDATE employes SET manager\_id = 145  
OÙ employe\_id = 100;

ensemble linesize 121  
format de chemin col A50

SELECT last\_name, LEVEL, SYS\_CONNECT\_BY\_PATH (last\_name, ‘/’) "Chemin"  
FROM employés  
Lorsque le niveau \<= 3 ET departement\_id = 80  
DÉBUT DE last\_name = 'King’  
CONNECT BY PRIOR = employe\_id manager\_id ET NIVEAU \<= 4;  
ERREUR:  
ORA-01436: CONNECT BY boucle dans les données utilisateur

SELECT last\_name, CONNECT\_BY\_ISCYCLE “cycle”, NIVEAU, SYS\_CONNECT\_BY\_PATH (last\_name, ‘/’) "Chemin"  
FROM employés  
Lorsque le niveau \<= 3 ET departement\_id = 80  
DÉBUT DE last\_name = 'King’  
CONNECT BY PRIOR NOCYCLE employe\_id = manager\_id  
ET NIVEAU \<= 4;

ROLLBACK;

CONNECT\_BY\_ISLEAF pseudo-  
Le pseudo-CONNECT\_BY\_ISLEAF retourne 1 si la ligne actuelle est une feuille de l’arbre défini par le CONNECT BY condition. Sinon, elle renvoie 0. Cette information indique si une ligne donnée peut être étendu à montrer plus de la hiérarchie.  
conn hr / hr

SELECT last\_name «Employé», CONNECT\_BY\_ISLEAF "IsLeaf»,  
NIVEAU, SYS\_CONNECT\_BY\_PATH (last\_name, ‘/’) "Chemin"  
FROM employés  
Lorsque le niveau \<= 3  
ET = 80 departement\_id  
DÉBUT DE last\_name = 'King’  
CONNECT BY PRIOR = employe\_id manager\_id  
ET NIVEAU \<= 4;

NIVEAU pseudo-

Pour chaque ligne renvoyée par une requête hiérarchique, le niveau retourne une pseudo-racine pour une ligne, 2 pour un enfant d’une racine, et ainsi de suite  
conn hr / hr

SELECT employe\_id, last\_name, manager\_id, NIVEAU  
FROM employés  
CONNECT BY PRIOR = employe\_id manager\_id;

SELECT LPAD (’’, 2 \* (niveau 1)) | ORG\_CHART last\_name, |  
employe\_id, manager\_id, job\_id  
FROM employés  
DÉBUT DE job\_id = 'AD\_VP’  
CONNECT BY PRIOR = employe\_id manager\_id;

SYS\_CONNECT\_BY\_PATH

Retourne le chemin d’une valeur de colonne de la racine aux nœuds, avec des valeurs séparées par des colonnes char pour chaque ligne renvoyée par CONNECT BY état  
SYS\_CONNECT\_BY\_PATH (, )  
conn Scott / Tiger

a20 col de format empname  
Col CBP le format A30

SELECT LPAD (’’, 2 \* NIVEAU, ‘’) | | Ename EmpName, dname, l’emploi,  
sys\_connect\_by\_path (Ename, ‘/’) cbp  
FROM emp e, dept d  
OÙ e.deptno = d.deptno  
DÉBUT DE MGR est NULL  
CONNECT BY PRIOR empno = mgr  
FRÈRES ET SOEURS ORDER BY emploi;

SELECT LPAD (’’, 2 \* NIVEAU, ‘’) | | Ename EmpName, dname, l’emploi,  
sys\_connect\_by\_path (empno, ‘.’) cbp  
D’SCOTT.EMP emp, dept scott.dept  
OÙ emp.deptno = dept.deptno  
DÉBUT DE MGR est NULL  
CONNECT BY PRIOR empno = mgr  
FRÈRES ET SOEURS ORDER BY Ename;

Démo Fonction

Utiliser une fonction pour recevoir le nœud actuel et recherche des parents du noeud courant  
CREATE OR REPLACE FUNCTION permissions\_sub\_tree\_root (  
the\_id en nombre,  
the\_level en nombre)  
NUMÉRO DE RETOUR EST

sub\_tree\_root NOMBRE (10);

BEGIN  
SELECT id  
EN sub\_tree\_root  
De la hiérarchie  
Lorsque le niveau = the\_level

- Connectez ‘haut’, à savoir trouver le parent  
CONNECT BY parent avant = id  
DÉBUT avec id = the\_id;

RETOUR sub\_tree\_root;  
FIN permissions\_sub\_tree\_root;  
/

SELECT id, nom, nom d’utilisateur  
DE (  
SELECT ID, parent, son nom,  
permissions\_sub\_tree\_root (id, LEVEL) ROOT  
De la hiérarchie  
CONNECT BY PRIOR id = parent) HIERARCHIE, autorisations  
Où root = hierarchy\_id;

GROUP BY Démo

Par groupe Démo avec CONNECT\_BY\_ROOT et  
CONNECT\_BY\_PRIOR  
conn hr / hr

SELECT nom, SUM (salaire) "Total\_Salary"  
DE (  
SELECT nom last\_name CONNECT\_BY\_ROOT, le salaire  
FROM employés  
OÙ departement\_id = 110  
CONNECT BY PRIOR = employe\_id manager\_id)  
GROUP BY nom;

Démos

Indentation conn hr / hr

Col lname de format A30

SELECT LPAD (’’, \* niveau 2, ‘’) | | last\_name LNAME, d.department\_id  
FROM employés e, les départements d  
OÙ e.department\_id = d.department\_id  
DÉBUT DE employe\_id = 100  
CONNECT BY PRIOR = e.employee\_id e.manager\_id;

Requête hiérarchique avec IN Dans un [NOT] IN condition dans une clause WHERE, si le côté droit de la condition est une sous-requête, vous ne pouvez pas utiliser NIVEAU sur le côté gauche de la condition. Cependant, vous pouvez spécifier le niveau dans une sous-requête de la clause FROM pour atteindre le même résultat. Par exemple, la déclaration suivante n’est pas valide:  
SELECT employe\_id, last\_name DE employés  
WHERE (employe\_id, niveau)  
IN (SELECT employe\_id, 2 de salariés)  
DÉBUT DE employe\_id = 2  
CONNECT BY PRIOR = employe\_id manager\_id;  
Mais la déclaration suivante est valide car il encapsule la requête contenant les informations de niveau dans la clause FROM:  
SELECT v.employee\_id, v.last\_name, v.lev  
DE (  
SELECT employe\_id, last\_name, NIVEAU Lev  
FROM employés v  
DÉBUT DE employe\_id = 100  
CONNECT BY PRIOR = employe\_id manager\_id) v  
WHERE (v.employee\_id, v.lev) IN (  
SELECT employe\_id, 2 de salariés);[/code]

---

<div class="post-metadata">

**Author:** ![debianhadic](https://www.debian-fr.org/user_avatar/www.debian-fr.org/debianhadic/32/3870_2.png) [@debianhadic](https://www.debian-fr.org/u/debianhadic)\
**Post date:** [Février 21, 2016, 3:55 UTC](https://www.debian-fr.org/t/connect-by/35154/3 "2016-02-21T03:55:52Z")

</div>

Je te remercie (même si la traduction en français n’est pas la plus pertinente !!), j’avais déjà lu cet exemple hier, mais dans leurs démos, les tables sont tout le temps simples, avec des clefs primaires auto incrémentées, si tu voyais la gueule des nôtres avec leurs Pk et Fk sur une dizaine de champs … 🙂  
Bon mais je m’y recolle …

---

<div class="post-metadata">

**Author:** ![tetrix](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/a4c791/32.png) [@tetrix](https://www.debian-fr.org/u/tetrix)\
**Post date:** [Février 21, 2016, 3:55 UTC](https://www.debian-fr.org/t/connect-by/35154/4 "2016-02-21T03:55:54Z")

</div>

> [@](#):
>
> (même si la traduction en français n’est pas la plus pertinente !!),

J’avais prévenu traduit viteuf par google

Edit: courage 🙂
