OVH Cloud OVH Cloud

SQL tree retrouver un chemin (rep. intervallaire)

10 réponses
Avatar
yvon.thoravalNO-SPAM
Bonjour tous,

devenu un fan (à tiques) de la représentation intervallaire, je me
demande s'il n'y a pas un moyen simple de retrouver le chemin d'accès à
un noeud ou une feuille.

dans mon arbre j'ai :

l'id, le niveau dans l'arborescence et le parent_id

pour le noeud "root" j'ai choisi : id = parent_id (càd 0 avec hsqldb)

ça demande un select récursif...

--
yt

10 réponses

Avatar
Ph. B.
Bonjour tous,



Bonjour,

devenu un fan (à tiques) de la représentation intervallaire, je me



Je vois çà ! ;-)

demande s'il n'y a pas un moyen simple de retrouver le chemin d'accès à
un noeud ou une feuille.



y a ! :-)

dans mon arbre j'ai :

l'id, le niveau dans l'arborescence et le parent_id

pour le noeud "root" j'ai choisi : id = parent_id (càd 0 avec hsqldb)

ça demande un select récursif...



Tss, tss, pourquoi faire de l'intervallaire alors ?
puisqu'il permet de s'affranchir du récursif (hyper pénalisant en SQL)

Si tu connais la feuille et que tu veux le chemin de la racine à la feuille,
cela doit donner un truc du genre:

SELECT *
FROM MATABLE
WHERE BG <= :BG_Feuille AND BD >= DB_Feuille
ORDER BY BG

--
Philippe.
Avatar
yvon.thoravalNO-SPAM
Ph. B. wrote:

SELECT *
FROM MATABLE
WHERE BG <= :BG_Feuille AND BD >= DB_Feuille
ORDER BY BG



Ah M*$¤DE !!! C'est simple comme bonjour, il faut s'y mettre à cette
simplicité de la rep. intervallaire...°;)
--
yt
Avatar
Fred BROUARD - SQLpro
plutôt :

SELECT *
FROM MATABLE
WHERE BG <= :BG_Feuille AND BD >= DB_Feuille
ORDER BY NIVEAU

A +



Yvon Thoraval a écrit:
Ph. B. wrote:


SELECT *
FROM MATABLE
WHERE BG <= :BG_Feuille AND BD >= DB_Feuille
ORDER BY BG




Ah M*$¤DE !!! C'est simple comme bonjour, il faut s'y mettre à cette
simplicité de la rep. intervallaire...°;)



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
yvon.thoravalNO-SPAM
Fred BROUARD - SQLpro wrote:

SELECT *
FROM MATABLE
WHERE BG <= :BG_Feuille AND BD >= DB_Feuille
ORDER BY NIVEAU



Oui, merci, la question se pose quand il y a plus d'une solution, car
mes BG_feuille et BD_feuille je les obtiens par un select.

par ex pour l'Alsace j'ai :

Terre
| ... |
France <--les autres pays-->
|
Alsace (région)
| | ... |
Andlau Barr ... Zellenberg (sous-régions)
| ... | |...| |...|
<--les appellations proprement dites-->

PB : tous les grands crus d'Alsace commencent par Alsace, si un
utilisateur fait une recherche sur "Alsace" (il n'est pas obligé de
connaître le découpage en régions et sous-régions) j'aimerais lui
ramener tout l'arbre sous Alsace en tant que région comprenant toutes
les sous-régions où il y a au moins d'une solution et bien sûr les
solutions.

Autre intérêt de trouver toutes ces solutions, le select where peut
porter sur autre chose que le nom de l'appellation :
- couleur du vin par ex ;
- nature du sol certainement plus intéressant oenologiquement parlant.

Là je ne vois qu'une solution en trois étapes :
- sélectionner toutes les feuilles solutions (sql) ;
- pour chaque feuille solution remonter le "path" racine-feuille (sql) ;
- parcourir l'arbre pour visualiser les "paths" sans doublons (java).

--
yt
Avatar
Etienne SOBOLE
"Fred BROUARD - SQLpro" a écrit dans le message
de news: 415c4675$0$15747$
plutôt :

SELECT *
FROM MATABLE
WHERE BG <= :BG_Feuille AND BD >= DB_Feuille
ORDER BY NIVEAU

A +



Ouarf.
Je connais pas moi ca.
Fred, y a quelque part sur ton site ou ca parle de cette syntaxe???
Ca marche sur tout les SGBD?

merci
Etienne
Avatar
yvon.thoravalNO-SPAM
Etienne SOBOLE wrote:

Fred, y a quelque part sur ton site ou ca parle de cette syntaxe???



amha le ":" est une coquille...
--
yt
Avatar
Ph. B.
Etienne SOBOLE wrote:
"Fred BROUARD - SQLpro" a écrit dans le message
de news: 415c4675$0$15747$

plutôt :

SELECT *
FROM MATABLE
WHERE BG <= :BG_Feuille AND BD >= DB_Feuille
ORDER BY NIVEAU

A +




Ouarf.
Je connais pas moi ca.
Fred, y a quelque part sur ton site ou ca parle de cette syntaxe???
Ca marche sur tout les SGBD?

merci
Etienne



Bien sur que cela marche ! :-)
Par contre il y a un coquille, il manque un ":" avant DB_Feuille...

MATABLE(ID, LIBELLE, NIVEAU, BG, BD)

SELECT *
FROM MATABLE
WHERE BG <= :BG_Feuille AND BD >= :DB_Feuille
ORDER BY NIVEAU

J'avais donné le lien dans un fil précédent de Yvon...
http://sqlpro.developpez.com/Tree/SQL_tree.html

--
Philippe.
Avatar
yvon.thoravalNO-SPAM
Ph. B. wrote:

Par contre il y a un coquille, il manque un ":" avant DB_Feuille...



C'est plutôt BD_Feuille non ? (coquille)

mais que signfie le ":" ???
--
yt
Avatar
Ph. B.
Yvon Thoraval wrote:

Ph. B. wrote:


Par contre il y a un coquille, il manque un ":" avant DB_Feuille...




C'est plutôt BD_Feuille non ? (coquille)

mais que signfie le ":" ???



le ":" précède tout paramètre que tu passes à ta requête avant de l'exécuter.
Dans le cas présent le paramètre pourrait tout à fait être nommé DB_Feuille bien
que pour la cohérence de l'ensemble BD_Feuille soit préférable...

--
Philippe.
Avatar
yvon.thoravalNO-SPAM
Ph. B. wrote:

le ":" précède tout paramètre que tu passes à ta requête avant de l'exécuter.



c'est du sql ça ? lequel ?
est-ce l'équivalent du "?" des preparedStatement() ???

--
yt