178
Chapitre 7 • Applications avancées en SQL
Cette requête est certainement la plus complexe de cet ouvrage. Il faut cependant
savoir que la situation étudiée est une simplification du cas général, dans lequel la
projection ne reprend pas nécessairement l’identifiant, ici NCLI, des entités dont on
a enregistré l’historique (voir [Hainaut, 2001a]).
7.3.4 La jointure temporelle
Le concept de jointure que nous avons étudié est plus complexe lorsqu’il s’applique
à des tables temporelles. Considérons qu’il existe une table qui reprend, pour
chaque localité, le délégué commercial qui est responsable des clients de cette localité. Cette table pourrait se présenter comme à la figure 7.4.
Figure 7.4 - Historique des délégués commerciaux responsables des localités
Si nous désirons ajouter le nom des délégués aux informations sur les clients, il est
évident que la requête de jointure classique est incorrecte :
select NCLI, C.debut, C.fin, C.LOCALITE, CAT, DELEGUE
from
H_CLIENT C, H_LOCALITE L
where C.LOCALITE = L.LOCALITE
... et que la suivante l’est tout autant :
select NCLI, C.debut, C.fin, C.LOCALITE, CAT, DELEGUE
from
H_CLIENT C, H_LOCALITE L
where C.LOCALITE = L.LOCALITE
and
C.debut = L.debut
En effet, (LOCALITE,debut) n’est pas, au sens strict du terme, une clé étrangère de
H_CLIENT vers H_LOCALITE, mais plutôt une clé étrangère temporelle, qui obéit à
une loi plus complexe 8 :
pour toute ligne d’état C de H_CLIENT dont LOCALITE n’est pas null, et pour
tout instant t tel que C.debut ≤ t < C.fin, il doit exister une ligne L de
H_LOCALITE telle que C.loc = L.loc et L.debut ≤ t < L.fin.
Chapitre 7 • Applications avancées en SQL
Cette requête est certainement la plus complexe de cet ouvrage. Il faut cependant
savoir que la situation étudiée est une simplification du cas général, dans lequel la
projection ne reprend pas nécessairement l’identifiant, ici NCLI, des entités dont on
a enregistré l’historique (voir [Hainaut, 2001a]).
7.3.4 La jointure temporelle
Le concept de jointure que nous avons étudié est plus complexe lorsqu’il s’applique
à des tables temporelles. Considérons qu’il existe une table qui reprend, pour
chaque localité, le délégué commercial qui est responsable des clients de cette localité. Cette table pourrait se présenter comme à la figure 7.4.
Figure 7.4 - Historique des délégués commerciaux responsables des localités
Si nous désirons ajouter le nom des délégués aux informations sur les clients, il est
évident que la requête de jointure classique est incorrecte :
select NCLI, C.debut, C.fin, C.LOCALITE, CAT, DELEGUE
from
H_CLIENT C, H_LOCALITE L
where C.LOCALITE = L.LOCALITE
... et que la suivante l’est tout autant :
select NCLI, C.debut, C.fin, C.LOCALITE, CAT, DELEGUE
from
H_CLIENT C, H_LOCALITE L
where C.LOCALITE = L.LOCALITE
and
C.debut = L.debut
En effet, (LOCALITE,debut) n’est pas, au sens strict du terme, une clé étrangère de
H_CLIENT vers H_LOCALITE, mais plutôt une clé étrangère temporelle, qui obéit à
une loi plus complexe 8 :
pour toute ligne d’état C de H_CLIENT dont LOCALITE n’est pas null, et pour
tout instant t tel que C.debut ≤ t < C.fin, il doit exister une ligne L de
H_LOCALITE telle que C.loc = L.loc et L.debut ≤ t < L.fin.
