Voici comment ajouter le niveau des éléments dans un arbre modélisé par intervalles.
Pour notre test, la table est la suivante :
CREATE TABLE T_VEHICULE_VHC
(VHC_ID INTEGER NOT NULL PRIMARY KEY,
VHC_BG INTEGER,
VHC_BD INTEGER,
VHC_NOM VARCHAR(16));
(VHC_ID INTEGER NOT NULL PRIMARY KEY,
VHC_BG INTEGER,
VHC_BD INTEGER,
VHC_NOM VARCHAR(16));
Les données que l’on y insère sont les suivantes :
INSERT INTO T_VEHICULE_VHC VALUES (1, 1, 26, 'ALL');
INSERT INTO T_VEHICULE_VHC VALUES (2, 2, 7, 'SEA');
INSERT INTO T_VEHICULE_VHC VALUES (3, 8, 19, 'EARTH');
INSERT INTO T_VEHICULE_VHC VALUES (4, 20, 25, 'AIR');
INSERT INTO T_VEHICULE_VHC VALUES (5, 3, 4, 'SUBMARINE');
INSERT INTO T_VEHICULE_VHC VALUES (6, 5, 6, 'BOAT');
INSERT INTO T_VEHICULE_VHC VALUES (7, 9, 10, 'CAR');
INSERT INTO T_VEHICULE_VHC VALUES (8, 11, 16, 'TWO WHEELS');
INSERT INTO T_VEHICULE_VHC VALUES (9, 17, 18, 'TRUCK');
INSERT INTO T_VEHICULE_VHC VALUES (10, 21, 22, 'ROCKET');
INSERT INTO T_VEHICULE_VHC VALUES (11, 23, 24, 'PLANE');
INSERT INTO T_VEHICULE_VHC VALUES (12, 12, 13, 'MOTORCYCLE');
INSERT INTO T_VEHICULE_VHC VALUES (13, 14, 15, 'BICYCLE');;
INSERT INTO T_VEHICULE_VHC VALUES (2, 2, 7, 'SEA');
INSERT INTO T_VEHICULE_VHC VALUES (3, 8, 19, 'EARTH');
INSERT INTO T_VEHICULE_VHC VALUES (4, 20, 25, 'AIR');
INSERT INTO T_VEHICULE_VHC VALUES (5, 3, 4, 'SUBMARINE');
INSERT INTO T_VEHICULE_VHC VALUES (6, 5, 6, 'BOAT');
INSERT INTO T_VEHICULE_VHC VALUES (7, 9, 10, 'CAR');
INSERT INTO T_VEHICULE_VHC VALUES (8, 11, 16, 'TWO WHEELS');
INSERT INTO T_VEHICULE_VHC VALUES (9, 17, 18, 'TRUCK');
INSERT INTO T_VEHICULE_VHC VALUES (10, 21, 22, 'ROCKET');
INSERT INTO T_VEHICULE_VHC VALUES (11, 23, 24, 'PLANE');
INSERT INTO T_VEHICULE_VHC VALUES (12, 12, 13, 'MOTORCYCLE');
INSERT INTO T_VEHICULE_VHC VALUES (13, 14, 15, 'BICYCLE');;
Que l’on peut présenter ainsi :
VHC_NOM VHC_ID VHC_NIVEAU VHC_PATH
------------------ ----------- ----------- --------------------------------
ALL 1 0
AIR 4 1 AIR
PLANE 11 2 AIR, PLANE
ROCKET 10 2 AIR, ROCKET
EARTH 3 1 EARTH
CAR 7 2 EARTH, CAR
TRUCK 9 2 EARTH, TRUCK
TWO WHEELS 8 2 EARTH, TWO WHEELS
BICYCLE 13 3 EARTH, TWO WHEELS, BICYCLE
MOTORCYCLE 12 3 EARTH, TWO WHEELS, MOTORCYCLE
SEA 2 1 SEA
BOAT 6 2 SEA, BOAT
SUBMARINE 5 2 SEA, SUBMARINE
------------------ ----------- ----------- --------------------------------
ALL 1 0
AIR 4 1 AIR
PLANE 11 2 AIR, PLANE
ROCKET 10 2 AIR, ROCKET
EARTH 3 1 EARTH
CAR 7 2 EARTH, CAR
TRUCK 9 2 EARTH, TRUCK
TWO WHEELS 8 2 EARTH, TWO WHEELS
BICYCLE 13 3 EARTH, TWO WHEELS, BICYCLE
MOTORCYCLE 12 3 EARTH, TWO WHEELS, MOTORCYCLE
SEA 2 1 SEA
BOAT 6 2 SEA, BOAT
SUBMARINE 5 2 SEA, SUBMARINE
Le calcul du niveau peut se faire par la requête :
SELECT VHC_ID,
(SELECT COUNT(*)
FROM T_VEHICULE_VHC
WHERE VHC_BG REF.VHC_BD) AS VHC_NIVEAU,
VHC_NOM
FROM T_VEHICULE_VHC AS REF;
(SELECT COUNT(*)
FROM T_VEHICULE_VHC
WHERE VHC_BG REF.VHC_BD) AS VHC_NIVEAU,
VHC_NOM
FROM T_VEHICULE_VHC AS REF;
En fait il s’agit de compter le nombre de parents d’un nÅ“ud.
Pour rajouter le calcul du niveau en dur dans la table, on peut faire comme ceci :
ALTER TABLE T_VEHICULE_VHC ADD VHC_NIVEAU SMALLINT;
Ce qui rajoute la colonne niveau dans la table.
Il faut maintenant la mettre à jour :
UPDATE REF
SET VHC_NIVEAU = (SELECT COUNT(*)
FROM T_VEHICULE_VHC
WHERE VHC_BG REF.VHC_BD)
FROM T_VEHICULE_VHC AS REF;
SET VHC_NIVEAU = (SELECT COUNT(*)
FROM T_VEHICULE_VHC
WHERE VHC_BG REF.VHC_BD)
FROM T_VEHICULE_VHC AS REF;
Le site web sur le SQL et les SGBDR
Frédéric Brouard, alias SQLpro, ARCHITECTE DE DONNÉES
Expert S.G.B.D relationnelles et langage S.Q.L
Moste Valuable Professionnal Microsoft SQL Server
Société SQLspot : modélisation, conseil, formation,
optimisation, audit, tuning, administration SGBDR
Enseignant: CNAM PACA, ISEN Toulon, CESI Aix en Prov.
L’ntreprise SQL Spot
Bonjour Frédéric
Tu perds les signes supérieurs et inférieurs dans tes requêtes, j’imagine pour protéger tes lecteurs d’un éventuel XSS.
Cela pourrait dérouter certains lecteurs