Est-ce possible en SQL - SQL/NoSQL - Programmation
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
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