Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Expert Confirmé Sénior Avatar de mnitu
    Homme Profil pro Marius Nitu
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    4 627
    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 627
    Points : 9 085
    Points
    9 085

    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>

  2. #2
    Expert Confirmé Sénior Avatar de mnitu
    Homme Profil pro Marius Nitu
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    4 627
    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 627
    Points : 9 085
    Points
    9 085

    Par défaut

    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>

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •