Est-ce possible en SQL

Est-ce possible en SQL - SQL/NoSQL - Programmation

Marsh Posté le 11-05-2017 à 18:05:27    

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

Reply

Marsh Posté le 11-05-2017 à 18:05:27   

Reply

Marsh Posté le 12-05-2017 à 22:43:50    

Tu peux tout à fait passer par une procédure stockée qui sera appelée dans une requête SQL ;)
 
Edit : comme j'ai compris, tu veux récupérer le noeud racine d'une arborescence à partir d'un noeud enfant, c'est bien ça ? La modélisation de ton arbo est adaptée en cas de nombreuses MAJ des enregistrements mais pas pour de la lecture. En effet, tu l'as constaté, cette modélisation nécessite des requêtes récursives. Il existe une autre modélisation d'une arbo en utilisant la représentation intervallaire. Gros avantage : en une seule requête SQL, tu récupères toute l'arbo ou le noeud racine. Par contre, cette représentation est plus adaptée quand tu fais plus de lecture (affichage) de l'arbo que de MAJ.
 
https://openclassrooms.com/courses/ [...] ervallaire


Message édité par rufo le 12-05-2017 à 22:49:45

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed