84
Chapitre 5 • Le langage SQL DML
Tous les SGBD n’acceptent cependant pas cette syntaxe. Nous verrons plus loin
d’autres formulations permettant d’exprimer une telle requête (sections 5.3.5 et
5.4.6).
5.3.3 Attention aux conditions d’association négatives
a) Le problème
La requête suivante désigne les commandes (c’est-à-dire les lignes de la table
COMMANDE) qui ne spécifient pas le produit PA60, autrement dit, celles pour
lesquelles il n’existe aucun détail spécifiant PA60.
Q1: select NCOM, DATECOM, NCLI
from
COMMANDE
where NCOM not in ( select NCOM
from
DETAIL
where NPRO = 'PA60')
La
sous-requête
(select NCOM from DETAIL where NPRO = 'PA60')
désigne ici les numéros des commandes dont au moins un détail spécifie le produit
PA60. La commande qui contient un de ces détails est donc à rejeter (not in).
Contrairement aux requêtes précédentes, on retient les lignes qui ne sont pas associées aux éléments d’un ensemble déterminé de lignes.
La requête suivante est parfois proposée, à tort, comme autre solution à ce
problème. En fait, cette requête désigne les commandes qui spécifient au moins un
produit différent de PA60 (mais qui par ailleurs peuvent également spécifier le
produit PA60!).
Q2: select NCOM, DATECOM, NCLI
from
COMMANDE
where NCOM in ( select NCOM
from
DETAIL
where NPRO <> 'PA60')
Ces deux requêtes, qui sont basées sur des conditions de sélection négatives,
doivent être examinées soigneusement car ces dernières sont la source d’erreurs
fréquentes. On analysera en particulier le résultat à obtenir sur la base de la partition 16 suivante de l’ensemble des commandes (figure 5.1) :
• C1 : les commandes qui n’ont pas de détails (cas rare !),
• C2 : les commandes dont aucun détail ne spécifie PA60,
• C3 : les commandes ayant à la fois un détail spécifiant PA60 et au moins un
détail spécifiant un autre produit,
• C4 : les commandes ne spécifiant que PA60.
16. On rappelle que l’ensemble de sous-ensembles non vides {E1, E2,..., En}, pour n>1, forme
une partition de E, non vide, ssi, (E = E1∪E2∪...∪En) et (∀ i,j ∈[1..n], i≠j ⇒ Ei ∩ Ej = ∅).
Chapitre 5 • Le langage SQL DML
Tous les SGBD n’acceptent cependant pas cette syntaxe. Nous verrons plus loin
d’autres formulations permettant d’exprimer une telle requête (sections 5.3.5 et
5.4.6).
5.3.3 Attention aux conditions d’association négatives
a) Le problème
La requête suivante désigne les commandes (c’est-à-dire les lignes de la table
COMMANDE) qui ne spécifient pas le produit PA60, autrement dit, celles pour
lesquelles il n’existe aucun détail spécifiant PA60.
Q1: select NCOM, DATECOM, NCLI
from
COMMANDE
where NCOM not in ( select NCOM
from
DETAIL
where NPRO = 'PA60')
La
sous-requête
(select NCOM from DETAIL where NPRO = 'PA60')
désigne ici les numéros des commandes dont au moins un détail spécifie le produit
PA60. La commande qui contient un de ces détails est donc à rejeter (not in).
Contrairement aux requêtes précédentes, on retient les lignes qui ne sont pas associées aux éléments d’un ensemble déterminé de lignes.
La requête suivante est parfois proposée, à tort, comme autre solution à ce
problème. En fait, cette requête désigne les commandes qui spécifient au moins un
produit différent de PA60 (mais qui par ailleurs peuvent également spécifier le
produit PA60!).
Q2: select NCOM, DATECOM, NCLI
from
COMMANDE
where NCOM in ( select NCOM
from
DETAIL
where NPRO <> 'PA60')
Ces deux requêtes, qui sont basées sur des conditions de sélection négatives,
doivent être examinées soigneusement car ces dernières sont la source d’erreurs
fréquentes. On analysera en particulier le résultat à obtenir sur la base de la partition 16 suivante de l’ensemble des commandes (figure 5.1) :
• C1 : les commandes qui n’ont pas de détails (cas rare !),
• C2 : les commandes dont aucun détail ne spécifie PA60,
• C3 : les commandes ayant à la fois un détail spécifiant PA60 et au moins un
détail spécifiant un autre produit,
• C4 : les commandes ne spécifiant que PA60.
16. On rappelle que l’ensemble de sous-ensembles non vides {E1, E2,..., En}, pour n>1, forme
une partition de E, non vide, ssi, (E = E1∪E2∪...∪En) et (∀ i,j ∈[1..n], i≠j ⇒ Ei ∩ Ej = ∅).
