Oracle, à partir de la version 10g permet une solution élégante à la division relationnelle via l’utilisation des tables imbriquées et des operateurs multiset.

Les jeux d’essai sont ceux de l’article La division relationnelle, mythe ou réalité proposé il y a long temps par SQLPRO. Attention, les types des colonnes ont été modifiés pour utiliser varchar2 à la place de char et un type de données utilisateur est défini : varchar2_tt, comme étant une table imbriquée des varchar2(2000)

Voilà la solution que je vous propose pour la division relationnelle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
Connected as mni
 
SQL> 
SQL> With Divisor As (
  2    Select Set(Cast(Collect(rayon_ryn) As varchar2_tt)) div
  3      From t_rayon
  4  )
  5  Select ville_etp
  6    From t_entrepot
  7   Group by ville_etp
  8  Having Set(Cast(collect(rayon_ryn) As varchar2_tt))
  9          Multiset Intersect
 10         (Select div from divisor) = (Select div from divisor)
 11  /
 
VILLE_ETP
----------------
MARSEILLE
TOULOUSE
 
SQL>
Et pour le cas d’une division exacte
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
Connected as mni
 
SQL> 
SQL> Select NOM_APR
  2    From T_APPAREIL
  3   Group By NOM_APR
  4   Having Set(Cast(collect(composant_cps) As varchar2_tt)) = (Select Set(Cast(collect(composant_cps) As varchar2_tt))
  5                                                                From t_composant
  6                                                             )
 
NOM_APR
----------------
magnétoscope
 
SQL>