98
Chapitre 5 • Le langage SQL DML
Cette requête construit des couples de personnes, la première étant la personne
subordonnée (S) et la seconde son responsable (R). Elle réalise donc la jointure de la
table PERSONNE avec elle-même, ce qu’on appelle une auto-jointure.
La requête suivante donne, pour chaque personne de nom Dupont, son numéro,
ainsi que le numéro et le nom de son responsable s’il existe.
select S.NPERS, R.NPERS, R.NOM
from
PERSONNE S, PERSONNE R
where S.RESPONSABLE = R.NPERS
and
S.NOM = 'Dupont'
union
select NPERS, '--', '--'
from
PERSONNE
where RESPONSABLE is null
and
NOM = 'Dupont'
Seule la première partie de la requête peut poser un problème (la seconde complète
la réponse en indiquant les personnes sans responsable, à la manière d’une jointure
externe). Pour l’interpréter, supposons qu’on dispose de deux tables décrivant les
personnes (figure 5.4). L’une, de nom PERSONNE, représente toutes les personnes;
l’autre, de nom SUPERIEUR, ne représente que les personnes qui sont responsables.
Il est évident que les personnes qui sont responsables d’autres personnes sont répertoriées dans les deux tables. En fonction du contenu de la table PERSONNE proposé
ci-dessus, ces tables contiendraient les données de la figure 5.4. La première partie
de la requête précédente s’écrirait alors comme suit.
select S.NPERS, R.NPERS, R.NOM
from
PERSONNE S, SUPERIEUR R
where S.RESPONSABLE = R.NPERS
and
S.NOM = 'Dupont'
Figure 5.4 - La table SUPERIEUR est un extrait de la table PERSONNE
On observe que la requête donnerait le même résultat si le contenu de SUPERIEUR
était le même que celui de PERSONNE. En remplaçant SUPERIEUR par
PERSONNE, on obtient alors la requête initiale.
Une table qui, pour la personne de numéro 'p4', contiendrait le numéro et le nom
de 'p4', ainsi que le numéro et le nom de ses subordonnés de deuxième niveau
Précédent

- 98/436

Suivant