p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Expert Confirmé Sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    4 945
    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 : 4 945
    Points : 9 810
    Points
    9 810

    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 Confirmé Sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    4 945
    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 : 4 945
    Points : 9 810
    Points
    9 810

    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, 00h45
  2. Solutions ETL Oracle
    Par PhilippePM dans le forum Alimentation
    Réponses: 1
    Dernier message: 28/08/2009, 13h33
  3. Réponses: 4
    Dernier message: 03/01/2009, 14h15
  4. [Division relationnelle] Comparaison sur plusieurs tuples
    Par jowsuket dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/04/2008, 15h49
  5. Division relationnelle : problème avec les doublons
    Par ced dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/12/2007, 16h49

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