IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Oracle Discussion :

Solutions spécifique Oracle à la division relationnelle


Sujet :

Contribuez Oracle

  1. #1
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    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 : 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>

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Et une version plus compacte encore
    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
     
    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>

Discussions similaires

  1. La division relationnelle (exists) ?
    Par delphino7 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 10/09/2010, 01h45
  2. Solutions ETL Oracle
    Par PhilippePM dans le forum Alimentation
    Réponses: 1
    Dernier message: 28/08/2009, 14h33
  3. Réponses: 4
    Dernier message: 03/01/2009, 15h15
  4. [Division relationnelle] Comparaison sur plusieurs tuples
    Par jowsuket dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/04/2008, 16h49
  5. Division relationnelle : problème avec les doublons
    Par ced dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/12/2007, 17h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo