4 votes

Valeur dans un champ en tant que référence dans la même table

Je suis certain que c'est très facile, mais je suis très mauvais en matière de bases de données...

J'ai le tableau suivant dans Access 2003 :

title        |     id
/root        |      1
/root/x      |      2
/root/x/y    |      3
/root/x/y/z  |      4
/root/x/a    |      5
/root/x/a/b  |      6

c'est-à-dire un tas de nœuds et de numéros d'identification - vous pouvez voir que /Root/x est le parent de /Root/x/y. J'aimerais créer une autre table qui contienne une liste de tous les nœuds, avec les numéros d'identification de leurs parents :

id  | parent id
1   |   -
2   |   1
3   |   2
4   |   3
5   |   2
6   |   5

La suite me donnera l'identifiant et la valeur du parent :

select id, left(c.title, instrrev(c.title, "/")-1)  as parentValue from nodeIDs

donne

id |  parentNode
1  |
2  |  /root 
3  |  /root/x 
4  |  /root/x/y
5  |  /root/x
6  |  /root/x/a

Quelle est l'étape supplémentaire nécessaire pour renvoyer les identifiants de ces nœuds parents, plutôt que leurs valeurs, c'est-à-dire renvoyer '1' au lieu de '/Root' dans cette dernière table ?

Merci beaucoup.

2voto

t-clausen.dk Points 17925

Quelque chose comme ça peut-être :

select c.id, 
left(c.title, instrrev(c.title, "/")-1)  as parentValue
, p.id as parentID
from nodeIDs c
left join
nodeIDs p
on left(c.title, instrrev(c.title, "/")-1) = p.title

0voto

Quelque chose comme ça, je pense.

select t1.id, 
       left(t1.title, instrrev(t1.title, "/")-1)  as parentNode,
       t2.id as parentID
from nodeIDs t1
inner join nodeIDs t2 on (left(t1.title, instrrev(t1.title, "/")-1)) = t2.title

Je n'ai pas de moyen facile de tester cela. Mais l'idée de base est que, après avoir obtenu le titre du nœud parent, vous pouvez faire une jointure interne sur celui-ci pour obtenir le numéro d'identification associé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X