Requête SQL dans une table Hierarchique étrange (Oracle)

Requête SQL dans une table Hierarchique étrange (Oracle) - SQL/NoSQL - Programmation

Marsh Posté le 17-10-2006 à 19:41:28    

SAlut!
 
Voila mon problème.
 
J'ai une table
Hierarchie
col x | col y
------------
1     |
2     |    1
3     |    1
4     |    2
5     |    2
6     |    3
11    |    4
12    |    4
13     |   4
14     |   4
15     |   5
16     |   5
17     |   5
18     |   5
19     |   6
 
Je donne un numéro y et je veut les x corespondants
Exemple :  
Si je donne 1
je voudrais avoir de 11 à 19 car dans 1 il y a 2 et 3, dans 2 et 3 il y a 4,5 et 6 ... qui eux contiennent 11 à 19  
-------------
Si je donne 2
je devrais avoir 11 à 18
-------------
Si je donne 3
je devrais avoir 19
 
 
Je suis conscient que je travaille sur une BD oracle mal foutu, mais je dois faire avec.
Select count(*)
from hierarchie, groupe
Where hierarchie.col x  = groupe  --> c'est ici ... je veux seulement les nombres correspondants :(  
AND ....
AND...
 
J'ignore si je m'exprime correctement, merci au moins a tous ceux qui essaie de comprendre mon problemes.

Reply

Marsh Posté le 17-10-2006 à 19:41:28   

Reply

Marsh Posté le 17-10-2006 à 20:34:48    

joue avec "connect by ... prior ..." et tu devrais t'en tirer en jouant avec la colonne calculée "level".
 
ceci dit, c'est vrai que c'est pas super évident, notamment si ton "arbre" est déséquilibré (pas partout de même profondeur)

Reply

Marsh Posté le 17-10-2006 à 20:36:10    

une autre solution consiste à passer par une procédure stockée, qui jouera avec une table temporaire avant de t'en renvoyer le contenu.
l'intérêt de cette solution, c'est que d'un point de vue algorythmie, tu fais abstraction de la clause propriétaire Oracle "connect by"

Reply

Marsh Posté le 17-10-2006 à 21:31:32    

Merci bien, je vais tenter de trouver des information sur le connect by.
 
Je ne comprend pas vraiment se que tu veux dire par procédure stocké?
me faire une procédure qui recois le chiffre désirer et me retourne les valeur corespondante?
 
Il y a aussi possibilité d'utiliser un packet de if .. y a t'il moyen d'utiliser des if dans un where entre des and?
where i =o
and a=p
and if (true) p=o
and?????? je ne connais pas la structure.
 
Merci beaucoup, je suis un stagiaire dans une compagnie et je n'ai personne pour me guider en oracle.
 
Bordel .... il aurait pas pu faire une BD relationnel avec des liens comme ils nous ont montré à l'école!!

Reply

Marsh Posté le 17-10-2006 à 21:47:24    

DOH!
je suis stupide ... j'utilise déja des procédure stocké ...  
 
Se code est dans une fonction justement.
 
sachant que la table est fixe j'ai vraiment envie de hardcodé kke chose dans le genre ... mais la encore je me demande comment l'intégrer
if (1) ->BETWEEN 11 AND 22
else if (2) -> BETWEEN 11 AND 18
else if (3) -> BETWEEN 19 AND 22
else if (4) -> BETWEEN 11 AND 14
else if (5) -> BETWEEN 15 AND 18
else if (6) -> BETWEEN 19 AND 22
 
Si je mets sa dans une procédure ... comment retourner 2 valeurs?  
val1 integer OUT
val2 integer OUT ?? ou je peut faire un tableau ...
et comment j'y accède?
 
Bon je vais continuer a travailler sur sa, si je trouverais pas quelque chose de mieux

Reply

Marsh Posté le 18-10-2006 à 09:57:59    

oublie ta solution.
 
ta table est figée aujourd'hui, mais dans 6 mois, qui te garantie qu'il n'y aura pas une nouvelle ligne, une suppression, ou un changement de catégorie ?
le trou dans la colonne x entre 6 et 11 confirme d'ailleurs ce que je dis : elle n'a rien de figé ta liste.
 
donc non, tu ne stockes pas ça comme un goret en dur.


Message édité par MagicBuzz le 18-10-2006 à 10:00:59
Reply

Marsh Posté le 18-10-2006 à 10:27:38    

Bon, une fois de plus, en lisant 2 minutes la doc Oracle (je connaissais pas du tout le fonctionnement de CONECT BY, mais juste son existance, donc tu en savais autant que moi), et en décomposant tranquillement ton problème, je viens de le résoudre en quelques minutes...
 
(faites un effort des fois, surtout quand on vous met sur la bonne piste dès le départ hein !)
 
Script :


create table hierarchie (x number not null, y number null);
 
insert into hierarchie (x, y) values (1, null);
insert into hierarchie (x, y) values (2, 1);
insert into hierarchie (x, y) values (3, 1);
insert into hierarchie (x, y) values (4, 2);
insert into hierarchie (x, y) values (5, 2);
insert into hierarchie (x, y) values (6, 3);
insert into hierarchie (x, y) values (11, 4);
insert into hierarchie (x, y) values (12, 4);
insert into hierarchie (x, y) values (13, 4);
insert into hierarchie (x, y) values (14, 4);
insert into hierarchie (x, y) values (15, 5);
insert into hierarchie (x, y) values (16, 5);
insert into hierarchie (x, y) values (17, 5);
insert into hierarchie (x, y) values (18, 5);
insert into hierarchie (x, y) values (19, 6);
 
commit;
 
select *
from
(
select x
from hierarchie
start with x = 1 -- Changer cette valeur par le point d'entrée
connect by prior x = y
) h1
where not exists
(
select null
from hierarchie h2
where h2.y = h1.x
start with x = 1 -- Pas besoin de changer celle-là par contre
connect by prior x = y
);


 
Sortie :


create table hierarchie (x number not null, y number null)
Table created
 
insert into hierarchie (x, y) values (1, null)
1 row inserted
 
 
insert into hierarchie (x, y) values (2, 1)
1 row inserted
 
 
insert into hierarchie (x, y) values (3, 1)
1 row inserted
 
 
insert into hierarchie (x, y) values (4, 2)
1 row inserted
 
 
insert into hierarchie (x, y) values (5, 2)
1 row inserted
 
 
insert into hierarchie (x, y) values (6, 3)
1 row inserted
 
 
insert into hierarchie (x, y) values (11, 4)
1 row inserted
 
 
insert into hierarchie (x, y) values (12, 4)
1 row inserted
 
 
insert into hierarchie (x, y) values (13, 4)
1 row inserted
 
 
insert into hierarchie (x, y) values (14, 4)
1 row inserted
 
 
insert into hierarchie (x, y) values (15, 5)
1 row inserted
 
 
insert into hierarchie (x, y) values (16, 5)
1 row inserted
 
 
insert into hierarchie (x, y) values (17, 5)
1 row inserted
 
 
insert into hierarchie (x, y) values (18, 5)
1 row inserted
 
 
insert into hierarchie (x, y) values (19, 6)
1 row inserted
 
 
commit
Commit complete
 
select *
from
(
select x
from hierarchie
start with x = 1 -- Changer cette valeur par le point d'entrée
connect by prior x = y
) h1
where not exists
(
select null
from hierarchie h2
where h2.y = h1.x
start with x = 1 -- Pas besoin de changer celle-là par contre
connect by prior x = y
)
 X
--
11
12
13
14
15
16
17
18
19
9 rows selected


 
:spamafote:

Reply

Marsh Posté le 18-10-2006 à 14:21:49    

Wow! merci beaucoup...
 
Je ne voulais pas que tu fasse toust à ma place... mais merci je comprend bien la.
 
Un gros Merci

Reply

Sujets relatifs:

Leave a Replay

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