Connect by

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 !

Salut,

j’ai trouvé ça la version en Anglais , 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]

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 … :slightly_smiling:
Bon mais je m’y recolle …

J’avais prévenu traduit viteuf par google

Edit: courage :slightly_smiling: