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
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
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>
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>
Partager