96
Chapitre 5 • Le langage SQL DML
select distinct LOCALITE, NPRO
from
CLIENT,PRODUIT
Construisons maintenant tous les couples effectifs, tels qu’on commande réellement
le produit dans la localité :
select distinct LOCALITE, NPRO
from
CLIENT C,COMMANDE M,DETAIL D
where C.NCLI=M.NCLI
and
M.NCOM=D.NCOM
Le service commercial sera certainement très intéressé par les produits qu’on ne
commande pas dans chaque commune, et pour lesquels un effort d’information
serait utile (les deux clauses distinct sont inutiles. Pourquoi ?) :
select distinct LOCALITE, NPRO
from
CLIENT, PRODUIT
except
select distinct LOCALITE,NPRO
from
CLIENT C,COMMANDE M,DETAIL D
where C.NCLI=M.NCLI
and
M.NCOM=D.NCOM
e) Remarque sur l’intersection et la différence
Ces opérateurs ne sont pas strictement indispensables (d’ailleurs certains SGBD ne
les offrent pas) dans la mesure où ils peuvent être exprimés simplement par les
requêtes standards.
L’intersection de deux tables est obtenue par leur jointure 23 , car celle-ci reprend
les éléments qui sont simultanément présents dans ces tables.
La différence s’exprimera par le prédicat not in dont la sous-requête définit les
éléments de la seconde collection. On utilisera aussi la forme not exists.
5.4.5 Les requêtes sur des structures de données cycliques
On qualifie de cyclique (ou récursive) une structure de données qui fait, directement
ou non, référence à elle-même. La table PERSONNE illustrée à la figure 5.2
présente une structure cyclique car la colonne RESPONSABLE est une clé étrangère
vers la table PERSONNE elle-même. Le rôle de cette colonne est de désigner le
responsable direct de chaque personne, s’il existe.
Figure 5.2 - Un schéma cyclique : la table PERSONNE se référence elle-même
23. L’opération évoquée ici, qui retient les lignes d’une table qui sont joignables avec celles
d’une autre table, est appelée, très logiquement, semi-jointure.
Chapitre 5 • Le langage SQL DML
select distinct LOCALITE, NPRO
from
CLIENT,PRODUIT
Construisons maintenant tous les couples effectifs, tels qu’on commande réellement
le produit dans la localité :
select distinct LOCALITE, NPRO
from
CLIENT C,COMMANDE M,DETAIL D
where C.NCLI=M.NCLI
and
M.NCOM=D.NCOM
Le service commercial sera certainement très intéressé par les produits qu’on ne
commande pas dans chaque commune, et pour lesquels un effort d’information
serait utile (les deux clauses distinct sont inutiles. Pourquoi ?) :
select distinct LOCALITE, NPRO
from
CLIENT, PRODUIT
except
select distinct LOCALITE,NPRO
from
CLIENT C,COMMANDE M,DETAIL D
where C.NCLI=M.NCLI
and
M.NCOM=D.NCOM
e) Remarque sur l’intersection et la différence
Ces opérateurs ne sont pas strictement indispensables (d’ailleurs certains SGBD ne
les offrent pas) dans la mesure où ils peuvent être exprimés simplement par les
requêtes standards.
L’intersection de deux tables est obtenue par leur jointure 23 , car celle-ci reprend
les éléments qui sont simultanément présents dans ces tables.
La différence s’exprimera par le prédicat not in dont la sous-requête définit les
éléments de la seconde collection. On utilisera aussi la forme not exists.
5.4.5 Les requêtes sur des structures de données cycliques
On qualifie de cyclique (ou récursive) une structure de données qui fait, directement
ou non, référence à elle-même. La table PERSONNE illustrée à la figure 5.2
présente une structure cyclique car la colonne RESPONSABLE est une clé étrangère
vers la table PERSONNE elle-même. Le rôle de cette colonne est de désigner le
responsable direct de chaque personne, s’il existe.
Figure 5.2 - Un schéma cyclique : la table PERSONNE se référence elle-même
23. L’opération évoquée ici, qui retient les lignes d’une table qui sont joignables avec celles
d’une autre table, est appelée, très logiquement, semi-jointure.
