Précédent   Forum du club des développeurs et IT Pro > Bases de données > Oracle > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources, et autres ressources sur Oracle et ses technologies
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 03/07/2012, 17h11   #1
mnitu
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 4 115
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 4 115
Points : 8 010
Points : 8 010
Par défaut 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>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 40
Vieux 04/07/2012, 09h08   #2
mnitu
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 4 115
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 4 115
Points : 8 010
Points : 8 010
Et une version plus compacte encore
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
Connected TO Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 
Connected AS mni
 
SQL> 
SQL> SELECT ville_etp
  2    FROM t_entrepot
  3   GROUP BY ville_etp
  4  HAVING (SELECT SET(Cast(Collect(rayon_ryn) AS varchar2_tt)) FROM t_rayon)
  5         Submultiset of Cast(collect(rayon_ryn) AS varchar2_tt)
  6  /
 
VILLE_ETP
----------------
MARSEILLE
TOULOUSE
 
SQL>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 40
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h11.


 
 
 
 
Partenaires

Hébergement Web