5.4 Extraction de données de plusieurs tables (jointure)
101
© Dunod – La photocopie non autorisée est un délit.
a) Les conditions d’association et de non-association
Il est clair que la requête :
select NCOM,DATECOM
from
COMMANDE
where NCLI in (select NCLI
from
CLIENT
where LOCALITE = 'Poitiers')
peut s’écrire également sous la forme d’une jointure :
select NCOM,DATECOM
from
COMMANDE, CLIENT
where COMMANDE.NCLI = CLIENT.NCLI
and
LOCALITE = 'Poitiers'
De même, la requête :
select *
from
COMMANDE
where NCOM in (select NCOM
from
DETAIL
where NPRO = 'PA60'
and
QCOM < (select QCOM
from
DETAIL
where NPRO = 'PA60'
and
NCOM = '30182'))
est-elle équivalente à :
select M.NCOM, DATECOM, NCLI
from
COMMANDE M, DETAIL D1, DETAIL D2
where M.NCOM = D1.NCOM
and
D1.NPRO = 'PA60'
and
D2.NCOM = '30182'
and
D2.NPRO = 'PA60'
and
D1.QCOM < D2.QCOM
La condition (M.NCOM = D1.NCOM) associe à chaque commande M chacun de ses
détails D1. La condition (D1.NPRO = 'PA60') retient les détails D1 qui spécifient
le produit PA60. Les conditions (D2.NCOM = '30182' and D2.NPRO =
'PA60') désignent le détail D2 qui sert de référence. La condition
(D1.QCOM < D2.QCOM) établit le critère de sélection des détails D1 par rapport au
détail de référence D2. Remarquons enfin que si la jointure entre M et D1 est classique, celle qui concerne D1 et D2 est plutôt spéciale, puisqu’elle ne joue pas sur
l’égalité entre un identifiant et une clé étrangère. Nous en reparlerons en 5.4.8.
En revanche, certaines structures de select emboités ne peuvent pas s’exprimer
par une jointure. Tel serait le cas de la recherche des commandes qui ne spécifient
pas PA60, vue auparavant et qu’on rappelle :
101
© Dunod – La photocopie non autorisée est un délit.
a) Les conditions d’association et de non-association
Il est clair que la requête :
select NCOM,DATECOM
from
COMMANDE
where NCLI in (select NCLI
from
CLIENT
where LOCALITE = 'Poitiers')
peut s’écrire également sous la forme d’une jointure :
select NCOM,DATECOM
from
COMMANDE, CLIENT
where COMMANDE.NCLI = CLIENT.NCLI
and
LOCALITE = 'Poitiers'
De même, la requête :
select *
from
COMMANDE
where NCOM in (select NCOM
from
DETAIL
where NPRO = 'PA60'
and
QCOM < (select QCOM
from
DETAIL
where NPRO = 'PA60'
and
NCOM = '30182'))
est-elle équivalente à :
select M.NCOM, DATECOM, NCLI
from
COMMANDE M, DETAIL D1, DETAIL D2
where M.NCOM = D1.NCOM
and
D1.NPRO = 'PA60'
and
D2.NCOM = '30182'
and
D2.NPRO = 'PA60'
and
D1.QCOM < D2.QCOM
La condition (M.NCOM = D1.NCOM) associe à chaque commande M chacun de ses
détails D1. La condition (D1.NPRO = 'PA60') retient les détails D1 qui spécifient
le produit PA60. Les conditions (D2.NCOM = '30182' and D2.NPRO =
'PA60') désignent le détail D2 qui sert de référence. La condition
(D1.QCOM < D2.QCOM) établit le critère de sélection des détails D1 par rapport au
détail de référence D2. Remarquons enfin que si la jointure entre M et D1 est classique, celle qui concerne D1 et D2 est plutôt spéciale, puisqu’elle ne joue pas sur
l’égalité entre un identifiant et une clé étrangère. Nous en reparlerons en 5.4.8.
En revanche, certaines structures de select emboités ne peuvent pas s’exprimer
par une jointure. Tel serait le cas de la recherche des commandes qui ne spécifient
pas PA60, vue auparavant et qu’on rappelle :
