Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1573 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1459079
grisensko
Posté le 17-10-2006 à 19:41:28  profilanswer
 

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.

mood
Publicité
Posté le 17-10-2006 à 19:41:28  profilanswer
 

n°1459107
MagicBuzz
Posté le 17-10-2006 à 20:34:48  profilanswer
 

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)

n°1459108
MagicBuzz
Posté le 17-10-2006 à 20:36:10  profilanswer
 

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"

n°1459140
grisensko
Posté le 17-10-2006 à 21:31:32  profilanswer
 

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!!

n°1459154
grisensko
Posté le 17-10-2006 à 21:47:24  profilanswer
 

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

n°1459306
MagicBuzz
Posté le 18-10-2006 à 09:57:59  profilanswer
 

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
n°1459324
MagicBuzz
Posté le 18-10-2006 à 10:27:38  profilanswer
 

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:

n°1459558
grisensko
Posté le 18-10-2006 à 14:21:49  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
[C#] Sauvegarder des fichiers dans une base SQL Server[PHP][Mysql] Transfert resultat requete
Impossible d'insérer un nombre dans une table MySQL (Prob de noob dsl)Requête SQL avec DISTINCT
Eliminer les doublons d'une table Access[BRIO / SQL] Tutoriel
Insertion d'un recordset entier dans une table[PHP] Récupérer et lancer une requête à partir d'une checkbox
fonction unlink bloque l'affichage d'une table 
Plus de sujets relatifs à : Requête SQL dans une table Hierarchique étrange (Oracle)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR