102
Chapitre 5 • Le langage SQL DML
select NCOM, DATECOM, NCLI
from
COMMANDE
where NCOM not in ( select NCOM
from
DETAIL
where NPRO = 'PA60')
Cette requête n’est en effet absolument pas équivalente à :
select distinct COMMANDE.NCOM, DATECOM, NCLI
from
COMMANDE, DETAIL
where COMMANDE.NCOM = DETAIL.NCOM
and
NPRO <> 'PA60'
ni d’ailleurs à :
select distinct COMMANDE.NCOM, DATECOM, NCLI
from
COMMANDE, DETAIL
where COMMANDE.NCOM <> DETAIL.NCOM
and
NPRO = 'PA60'
Il faut se souvenir qu’une jointure basée sur le couple identifiant primaire/
clé étrangère permet de matérialiser des associations entre lignes. Elle ne permet
pas de spécifier l’inexistence d’associations.
Conclusion
La jointure et la sous-requête permettent d’exprimer des conditions d’association
entre lignes. En revanche, des conditions de non-association ne sont généralement
exprimables que par des sous-requêtes 28 , ainsi que, bien sûr, par la forme not exists
décrite en 5.3.5.
b) Sous-requête et clé étrangère multi-composant
Cette question a déjà été abordée dans la section 5.3.5. Nous pouvons ici lui
apporter une réponse supplémentaire. Il s’agit de rechercher (schéma 3.9) les
comptes auxquels ont été attachés des achats faits le 23-04-2005. Cette requête, que
nous avons déjà traduite sous la forme d’une sous-requête et d’une condition existentielle, peut aussi s’exprimer sous la forme d’une jointure :
select C.NCLI, C.NFOURN, ...
from
COMPTE C, ACHAT A
where A.NCLI = C.NCLI
and
A.NFOURN = C.NFOURN
and
DATEA = '23-04-2005'
28. Nous verrons cependant, dans la section 6.3.2, comment une jointure externe permet de sélectionner les lignes célibataires.
Chapitre 5 • Le langage SQL DML
select NCOM, DATECOM, NCLI
from
COMMANDE
where NCOM not in ( select NCOM
from
DETAIL
where NPRO = 'PA60')
Cette requête n’est en effet absolument pas équivalente à :
select distinct COMMANDE.NCOM, DATECOM, NCLI
from
COMMANDE, DETAIL
where COMMANDE.NCOM = DETAIL.NCOM
and
NPRO <> 'PA60'
ni d’ailleurs à :
select distinct COMMANDE.NCOM, DATECOM, NCLI
from
COMMANDE, DETAIL
where COMMANDE.NCOM <> DETAIL.NCOM
and
NPRO = 'PA60'
Il faut se souvenir qu’une jointure basée sur le couple identifiant primaire/
clé étrangère permet de matérialiser des associations entre lignes. Elle ne permet
pas de spécifier l’inexistence d’associations.
Conclusion
La jointure et la sous-requête permettent d’exprimer des conditions d’association
entre lignes. En revanche, des conditions de non-association ne sont généralement
exprimables que par des sous-requêtes 28 , ainsi que, bien sûr, par la forme not exists
décrite en 5.3.5.
b) Sous-requête et clé étrangère multi-composant
Cette question a déjà été abordée dans la section 5.3.5. Nous pouvons ici lui
apporter une réponse supplémentaire. Il s’agit de rechercher (schéma 3.9) les
comptes auxquels ont été attachés des achats faits le 23-04-2005. Cette requête, que
nous avons déjà traduite sous la forme d’une sous-requête et d’une condition existentielle, peut aussi s’exprimer sous la forme d’une jointure :
select C.NCLI, C.NFOURN, ...
from
COMPTE C, ACHAT A
where A.NCLI = C.NCLI
and
A.NFOURN = C.NFOURN
and
DATEA = '23-04-2005'
28. Nous verrons cependant, dans la section 6.3.2, comment une jointure externe permet de sélectionner les lignes célibataires.
