Afficher la liste de toutes les liaisons
à sens unique entre deux villes pour lesquelles
la population de l'une des 2 villes est inférieure
à 80000 habitants.
Relations
entre tables
En complément des liaisons définies
ci-dessus, il faut vérifier que la chaîne
"V1.Ville+V.Ville" ne se trouve pas dans la
table "Distances", car cela voudrait dire
que la liaison entre les 2 villes est à double
sens. Cette condition est vérifiée grace
à la clause Select imbriquée.
Afficher la liste des villes, qui peuvent
être distantes de 4 tronçons routiers (il
peut en effet y avoir des liaisons plus courtes en 2
ou 3 tronçons), et la distance qui les séparent.
Relations
entre tables
Requête SQL
Nous atteignons ici les limites du langage SQL car
ce langage n'est pas récursif et le traitement général
de question de ce type implique un large recours à la récursivité.
Afficher le nombre d'habitants par région
et département. On supposera que la population
d'une région se résume à celle
des villes qui font partie du réseau routier.
Donner le nom de la région qui
possède le plus long réseau routier et
le nombre de kilomètres de ce réseau.
Pour traiter cette question il est nécessaire
de créer 2 requêtes :
6.1- Requête de création d'une table
de travail "WorkTable" constituée des attributs
: Numregion, Nomregion et Distance pour toutes les liaisons, à
double sens, entre 2 villes de la même région.
Cette requête est lié par un prédicat "UNION"
à une autre requête qui ajoute à la précédente
toutes les liaisons (à sens unique) entre 2 villes de la
même région.
6.2- Requête de sélection, à partir
de la table "WorkTable" constituée précédemment.
Relations
entre tables (requête 6.1)
Requête SQL
6.1
CREATE VIEW WorkTable(Numregion, Nomregion,
Distance) AS SELECT R.numregion, R.Nomregion, Sum(D.Distance)/2 FROM Distances D, Villes V, Villes V1, Departement P, Departement
P1, Region R, Region R1 WHERE D.Villedepart=V.Ville AND V.Numdept=P.Numdept AND P.Numregion=R.numregion AND D.Villearrivee=V1.Ville AND V1.Numdept=P1.Numdept AND P1.Numregion=R1.numregion AND R.Numregion=R1.Numregion AND D.villedepart IN
(SELECT villearrivee FROM
Distances WHERE D.villearrivee=villedepart) GROUP BY R.Numregion, R.Nomregion UNION SELECT R.numregion, R.Nomregion, Sum(D.Distance) FROM Distances D, Villes V, Villes V1, Departement P, Departement
P1, Region R, Region R1 WHERE D.Villedepart=V.Ville AND V.Numdept=P.Numdept AND P.Numregion=R.numregion AND D.Villearrivee=V1.Ville AND V1.Numdept=P1.Numdept AND P1.Numregion=R1.numregion AND R.Numregion=R1.Numregion AND D.villedepart NOT IN
(SELECT villearrivee FROM
Distances WHERE D.villearrivee=villedepart) GROUP BY R.Numregion, R.Nomregion;
Relations entre
tables (requête 6.2)
Requête SQL
6.2
La première ligne de la requête suivante
donne la réponse à la question.
SELECT W.numregion, W.Nomregion, Sum(W.Distance)
AS "Longueur du réseau" FROM WorkTable AS W GROUP BY W.numregion, W.Nomregion ORDER BY 3DESC;