Requete qui sort tous les chemins parents

aztcaLISS Messages postés 91 Date d'inscription samedi 3 mai 2003 Statut Membre Dernière intervention 25 avril 2008 - 14 juin 2007 à 15:31
aztcaLISS Messages postés 91 Date d'inscription samedi 3 mai 2003 Statut Membre Dernière intervention 25 avril 2008 - 18 juin 2007 à 21:40
Salut,

Je travail avec ms access 2003.

J'ai une table nommé "Groups".
Elle contient 2 colonnes: Group(nom du groupe) et Path(Chemin dont un groupe a des droits).
Voici un example:
-------------------------------------
Group    Path
-----      ----
Grp1     C:\folder1\
Grp1     C:\folder2\
Grp1     C:\folder2\Test\sub\
Grp1     C:\folder2\sub\
Grp1     D:\
Grp2     C:\folder1\
Grp2     C:\folder1\sub\
-------------------------------------
Grp1 et Grp2 ont donc des droits sur les dossier montré ci-haut.

Ce que je veux faire, c'est une requete qui sort tous les chemins parents des diffrerents groupes.
Par example, le chemin "C:\folder2" de "Grp1" est parent de "C:\folder2\Test\sub" et de "C:\folder2\sub".

la reponse de cette requete serait donc:
-------------------------------------
Group    Path
-----      ----
Grp1     C:\folder1\
Grp1     C:\folder2\
Grp1     D:\
Grp2     C:\folder1\
-------------------------------------


est-ce qu'une telle requete est possible?


merci

azt

4 réponses

dominique.stock Messages postés 436 Date d'inscription vendredi 7 novembre 2003 Statut Membre Dernière intervention 8 octobre 2008 7
14 juin 2007 à 16:43
Bonjour ,
tu fais :
Select * from groups where path like 'C:\%'  and path<>'C:\'
et tu auras tous les enfants de c:\
C'est du sqlserver , adaptes le en access ....

Dom
0
aztcaLISS Messages postés 91 Date d'inscription samedi 3 mai 2003 Statut Membre Dernière intervention 25 avril 2008
14 juin 2007 à 17:14
Ca ne peut pas fonctionner car le chemin parent n'est pas obligatoirement "c:".
Comme dans l'exemple que j'ai mis, le "Grp1" n'a pas directement de droit sur le le "c:".

Il a acces a "C:\folder2" mais non directement a "C:".
"C:\folder2" est donc le parent de n'importe quel chemin en dessous de lui.

Par example le "C:\folder2\Test\sub" et le "C:\folder2\sub" sont des chemins enfants de "C:\folder2"

De plus, "C:\folder1" et " D:" sont tous les 2 des chemins parents car ils ne contiennent aucun enfant et ceci pour le "Grp1".

Je pense qu'il faut faire un GROUP BY sur la colonne "Group" pour grouper nos groupes ensemble. De plus, un GROUP BY sur la colonne "path" pour grouper les paths similaire mais ceci avec une restriction qui empeche que "C:\folder2\sub" soit visible car "C:\folder2" existe deja.

azt
0
lofo18 Messages postés 30 Date d'inscription mardi 19 avril 2005 Statut Membre Dernière intervention 29 septembre 2010
18 juin 2007 à 13:16
Salut
je sais pas si ça peut t'aider, mais c'est peut etre un élement de réponse

Renvoi tous les parents ayant un enfant dans la colone path:
SELECT G1.Group, G1.Path
FROM Groups as G1, Groups as G2
WHERE G2.path LIKE G1.path + '?*'
GROUP BY G1.Group, G1.Path

Recupére tous les enfants, donc après ça, il ne te reste plus qua faire un NOT EXISTS pour récupérer tous les autres (donc les parents):

SELECT G1.Group, G1.Path 
FROM Groups as G1, Groups as G2
WHERE G1.path LIKE G2.path + '?*'
GROUP BY G1.Group, G1.path

je ne suis pas sur que ce soit sans faille, mais j'espère que ça t'aidera

Par contre, pour moi D:\ n'est pas considéré comme un parent, car il na pas d'enfant.
il sera parent si tu as un tuple dans ta table du genre :
-------------------------------------
Group    Path
-----      ----
Grp1     C:\folder1\
Grp1     C:\folder2\
Grp1     C:\folder2\Test\sub\
Grp1     C:\folder2\sub\
Grp1     D:\
Grp1     D:\folder1\
Grp2     C:\folder1\
Grp2     C:\folder1\sub\
-------------------------------------
(en tout cas pour la premiere requete que j'ai marqué)

bon courage
0
aztcaLISS Messages postés 91 Date d'inscription samedi 3 mai 2003 Statut Membre Dernière intervention 25 avril 2008
18 juin 2007 à 21:40
Salut,

En fait, j'avais mal analyser mon probleme. Je viens de m'apercevoir qu'il est beaucoup plus complexe que ce que j'avais mentionner ci-haut.

Je ne pourrais donc pas faire de requete pour le resoudre. Je vais devoir faire une fonction pour ca.

Mais je vous remercie quand meme pour vos reponses.

a+

azt
0