Solutions spécifique Oracle à la division relationnelle
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:
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:
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> |