Bonjour à tous !
Je suis actuellement en train de bosser sur un sujet SQL.
Je dois remonter une hiérarchie contenue dans une seule et unique table.
Voici un exemple qui fonctionne manuellement plus claire :
J'ai une table ACT d'organisations:
SELECT PARENT_KEY FROM ACT WHERE ACT_NAME='XXXXX';
On va dire que PARENT_KEY = 28
Je récupère donc la clé de l'organisation parente puis je récupère diverse données avec cette clée
SELECT ACT_KEY, PARENT_KEY, ORG_UDF_LEVEL FROM ACT WHERE ACT_KEY=28;
Si le niveau de hiérarchie vaut 2, ORG_UDF_LEVEL = 2, j'ai ce qu'il me faut.
Sinon je relance la requête avec le nouveau parent key :
SELECT ACT_KEY, PARENT_KEY, ORG_UDF_LEVEL FROM ACT WHERE ACT_KEY=46;
Jusqu'à ce que ORG_UDF_LEVEL = 2.
Je cherche donc une requête qui me recherche automatiquement la valeur qui m'interesse.
J'ai déjà fait ça :
SELECT ACT.ACT_NAME, ACT.PARENT_KEY, ACT.ORG_UDF_LEVEL,
ACT2.ORG_UDF_SHORT_NAME, ACT2.ORG_UDF_LEVEL, ACT3.ORG_UDF_SHORT_NAME, ACT3.ORG_UDF_LEVEL
FROM ACT
LEFT JOIN ACT ACT2 ON ACT.PARENT_KEY=ACT2.ACT_KEY
LEFT JOIN ACT ACT3 ON ACT2.PARENT_KEY=ACT3.ACT_KEY
ect...
WHERE ACT.ACT_NAME='XXXXX';
Mais c'est clairement pas la solution. J'ai pas besoin des données intermédiaires.
Il y a ce script qui fonctionne :
declare
v_level varchar2(2);
v_parent_key varchar2(7);
begin
v_level :=99;
v_parent_key :='4';
WHILE v_level > 2 LOOP
select
PARENT_KEY, ORG_UDF_LEVEL
into v_parent_key, v_level
from
ACT
where
ACT_KEY = v_parent_key;
IF v_level = 2 THEN
dbms_output.put_line('PARENT KEY :' || v_parent_key || ' LEVEL : '||v_level);
END IF;
END LOOP;
end;
Mais j'aimerai du SQL,
Merci d'avance,
Jimmy