arborescence en SQL

arborescence en SQL - Programmation

Marsh Posté le 30-03-2001 à 12:15:17    

bonjour voila lenonce du probleme:
 
une table contenant des categories de produits.
cette table avec un code d'activation mis a true si un produit correspondant a cette categorie est lui meme actif (dans une autre table)
Il est simple d'activer les categorie en fanction des produits actif en faisant une requete du genre:
update CAT inner join PRD on CAT.CODE=PRD.CATCODE set CAT.ACTIF=1 where PRD.ACTIF=1
 
le probleme est quil'existe une colonne permettant de créer une structure arborescente au sein des categorie.
genre:
 
COD                 MOTHER                   OK          des
1                                                     0          livre
2                                                     0        crayons    
3                      1                              0          INFO
4                      3                              1          SQL
 
voila, dans la logique des choses la categorie 4 étant active, toutes les categorie mere doivent etre activée pour obtenir:
 
COD                 MOTHER                   OK          des
1                                                     1          livre
2                                                     0        crayons    
3                      1                              1          INFO
4                      3                              1          SQL
 
question: creer une requete SQL generant cette mise à jour....
merci a ceux qui pourront maider

 

[edit]--Message édité par Cthulhu--[/edit]


---------------
[code]
Reply

Marsh Posté le 30-03-2001 à 12:15:17   

Reply

Marsh Posté le 30-03-2001 à 12:29:01    

jsuis pas un pro du sql mais je crois pas ke ce soit possible en sql pure...
Vaut mieux passer par un chtit curseur a mon avis...

Reply

Marsh Posté le 30-03-2001 à 12:31:29    

je dois integre ces requetes dans un prog en java... mais je ne peux utiliser que des statement, aucun preparestatement...as tu une idee?

Reply

Marsh Posté le 30-03-2001 à 12:31:58    

On dirai les ennoncés de mon prof d'info.
Désolé, mais g rien compris...  :sarcastic:

Reply

Marsh Posté le 30-03-2001 à 12:38:36    

c pas evident evident ni a comprendre ni a explique par ecrit, mais en gros, imagine que lors dune mise a jour de la BDD il faille activer les categorie uniquement pour des produits qui sont actifs (a quoi sert dactiver une categorie si aucun produit ne lui correspond) mais le probleme c que la categorie peut etre une subordonnee dune autre genr : livre=>informatique=>java
si on active la categorie "java", il faut egalement activer les deux autres... tu comprends mieux?

Reply

Marsh Posté le 30-03-2001 à 12:43:38    

Franchement c'est pas bien compliqué
Enfin si j'ai bien tout compris :)
 
Mais par égard, a comment tu nous a fait chier avec ton post de merde avec l'énigme à la noix que tu te fous de notres gueule, je répondrait pas !

Reply

Marsh Posté le 30-03-2001 à 12:43:59    

Bah tjrs pas :pt1cable:  
Mais pkoi ne pas creer une vue avec seulement les champs que tu veux garder dans ton select ?

Reply

Marsh Posté le 30-03-2001 à 12:44:37    

thegti a écrit a écrit :

Franchement c'est pas bien compliqué
Enfin si j'ai bien tout compris :)
 
Mais par égard, a comment tu nous a fait chier avec ton post de merde avec l'énigme à la noix que tu te fous de notres gueule, je répondrait pas !




 
 
 
 :lol:  :lol:  :lol:

Reply

Marsh Posté le 30-03-2001 à 12:48:04    

Les SQL ne gère pas les aborescence et donc les mises à jour en cascade.
En fait tu dois faire une sous requete pas niveau d'aborecence.  
Si ton niveau d'aborescence en inconnu tu est obligé d'intégré ta
requete dans un script

Reply

Marsh Posté le 30-03-2001 à 12:48:37    

thegti a écrit a écrit :

Franchement c'est pas bien compliqué
Enfin si j'ai bien tout compris :)
 
Mais par égard, a comment tu nous a fait chier avec ton post de merde avec l'énigme à la noix que tu te fous de notres gueule, je répondrait pas !




 
salut thegti, je voulais juste te signaler quen fait, bowfinger est un collegue a moi et que ce con a voulu me pourir la vie en se faisant passer pour moi... je peux tassurer que le post de lenigme ne viens pas de moi. sinon le message "cthulhu et bowfinger ne font quun" ne serait pas venu de bowfinger mais de Cthulhu

Reply

Marsh Posté le 30-03-2001 à 12:48:37   

Reply

Marsh Posté le 30-03-2001 à 12:50:05    

seblamb a écrit a écrit :

Les SQL ne gère pas les aborescence et donc les mises à jour en cascade.
En fait tu dois faire une sous requete pas niveau d'aborecence.  
Si ton niveau d'aborescence en inconnu tu est obligé d'intégré ta
requete dans un script




exact, je pense comme toi que c cela quil faut faire, mais je ne suis pas un pro sql et je ne aprviens pas a compiler ma requete de mise a jour avec une sous requete...
pourrais tu me donner un exemple de code stp

Reply

Marsh Posté le 30-03-2001 à 13:16:51    

Deja faut faire une requete qui trouve les catégories à modifier
SELECT CODE FROM CAT WHERE MOTHER IN  
   (SELECT CODE FROM CAT WHERE MOTHER IN  
                (SELECT CODE FROM CAT, PRD  
                 WHERE PRD.ACTIF=1 AND CAT.CODE=PRD.CATCODE ))
 
la ligne "SELECT CODE FROM CAT WHERE MOTHER IN " doit être  
reproduite autant de fois qu'il y a de niveau dans l'arborescence
et puis ensuite :  
UPDATE CAT SET ACTIF=1 WHERE CODE IN [la requete precedente]

Reply

Marsh Posté le 30-03-2001 à 13:27:37    

fabd> i veut faire un truc du genre:
  a depend de b
  b depend de c
  c depend de d
  d depend ... depend de n
 
et si n change bah a,b,c,d,.. changent aussi
Enfin, c ce ke jai compris. :crazy:
 
Mais a mon avis ... c du pseudo-recursif (ou meme pure recursif) ke tu dois faire... et pi fo pas se baser sur le fait ke les nivos de ton arborescence sont connues car d'apres ce ke jai compris... ta table peut grandir a tout moment et donc tes nivos aussi ...  
 
Moi, je passerai par...
 
P.S: thegti> c vrai ke ti va fort la !! :sarcastic:

Reply

Marsh Posté le 30-03-2001 à 14:04:22    

merci les gars, vous avez tout les deux raison, en theorie je devrais obtenir une pseudo recursive car en effet le nombre de etage ne peut etre connu a lavance car je ne peux pas utiliser de requetes paramétrées... par contre qqn mas dit que la solution au probleme était d'utiliser une boucle du type :
 
while(stat.executeUpdate(sql)!=0)
{}
 
mais ce qui me pose probleme c la ligne au dessus:
sql="";

Reply

Marsh Posté le 30-03-2001 à 14:11:23    

le mieux serait de passer par un trigger.. mais encore fo til ke tu puisses en faire.... car il fofrai ke tai acces au sgbd...
et si tu y a acces, bah... fais une proc. stoc...  
Efin, je pense ke c kom ca kil fodrai faire...

Reply

Marsh Posté le 30-03-2001 à 14:12:52    

ok, merci, je vous tient au courant...

Reply

Marsh Posté le 30-03-2001 à 14:56:17    

merci les gars, the gti avait raison ct pas tellement compliqué,il suffisait de chopper la philosophie des sous-requètes...
la solution qui sera conservee est:
 
 
sql="update set ACTIF=1 where CODE in (select MOTHER from CAT where ACTIF=1 and (MOTHER<>'' and not MOTHER is null))and ACTIF=0";
stat=con.createStatement();
while(stat.executeUpdate()){
 
}
merci a tout ceux qui mont apporter leur aide.:hello:

Reply

Sujets relatifs:

Leave a Replay

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