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

SQL Oracle Discussion :

Eviter les produits cartésiens [Fait]


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Par défaut Eviter les produits cartésiens
    Bonjour à tous,

    Je dois extraire des données Oracle dans un fichier CSV.

    Le fichier de sortie doit avoir informations suivantes :
    ID;Activité;Canal;IP;

    J'ai une table centrale avec mes ID, et 3 tables Activités / Canal / IP qui sont liées avec une clé étrangère à ma table centrale contenant l'ID
    Les liaisons entre ma table ID et mes 3 tables est en 1 - n

    Prenons l'exemple suivant :
    • ID 12345
    • Activités liées : A1 et A2
    • Canal lié : C1
    • IP liées : I1 et I2


    Je voudrais avoir au final le résultat suivant :
    ID;A1;C1;I1
    ID;A2;;I2 => (Champ Canal vide car je n'ai qu'un seul canal)

    Note supplémentaire : Je ne sais pas à l'avance si les ID vont avoir un plus grand nombre d'activités, de canaux ou d'IP...

    Aujourd'hui je procède en 3 requêtes séparées pour obtenir
    ID;A1;;
    ID;A2;;
    ID;;C1;;
    ID;;;I1
    ID;;;I2;

    Mon but premier est surtout d'aviter un produit cartésien du type :
    ID;A1;C1;I1;
    ID;A1;C1;I2;
    ID;A2;C1;I1;
    ...


    Si quelqu'un a une solution ou une pîste...... Merci d'avance.

    Autres informations :
    BDD Oracle 8i (donc pas de LEFT OUTER JOIN mais des WHERE xxx (+)= yyy )

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Et si tu commençais par nous donner les 3 requêtes en question

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Le problème ressemble à ce sujet, j'imagine que la solution de Laurent ressemblera à ce qu'il vous faut :
    http://www.developpez.net/forums/d70...eurs-requetes/

  4. #4
    Expert confirmé 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
    Par défaut
    Natural Join en Oracle 8 ça va être un peu difficile.

    La jointure se fait apparemment sur id et un numéro d'ordre des enregistrements. Pour le numéro d'ordre on peut utiliser l'analytique qui existe dans certaines arômes d'Oracle 8. Pour la table centrale il faut utiliser un pivot pour multiplier les enregistrements X fois. Ensuite jointures externes et filtrage pour éliminer les enregistrements où toutes les 3 codes sont nulles. En conclusion quelque chose de type (je n'ai pas une base Oracle 8 sous la main)
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    create table pivot (
      r number
    )
    /
    insert into pivot
      select rownum from all_objects
     where rownum <= 10
    /
    create table t_tab (
      id number
    )
    /
    insert into t_tab values(12345)
    /
    insert into t_tab values(12346)
    /
    create table t_act (
      id     number,
      cod_a  varchar2(2)
    )
    /
    insert into t_act values(12345, 'A1')
    /
    insert into t_act values(12345, 'A2')
    /
    insert into t_act values(12346, 'A1')
    /
    create table t_canal (
      id     number,
      cod_c  varchar2(2)
    )
    /
    insert into t_canal values(12345, 'C1')
    /
    insert into t_canal values(12346, 'C1')
    /
    insert into t_canal values(12346, 'C2')
    /
    create table t_ip (
      id     number,
      cod_i  varchar2(2)
    )
    /
    insert into t_ip values(12345, 'I1')
    /
    insert into t_ip values(12345, 'I2')
    /
    commit
    /
    mni@DIANA> Select t.id, a.cod_a, c.cod_c, i.cod_i
      2    from
      3    (select id, r from t_tab, pivot
      4    ) t,
      5    (select id, cod_a, row_number() over (partition by id order by cod_a) r
      6       from t_act
      7    ) a,
      8    (select id, cod_c, row_number() over (partition by id order by cod_c) r
      9       from t_canal
     10    ) c,
     11    (select id, cod_i, row_number() over (partition by id order by cod_i) r
     12    from t_ip) i
     13  Where t.id = a.id(+)
     14    And t.r  = a.r(+)
     15    And t.id = c.id(+)
     16    And t.r  = c.r(+)
     17    And t.id = i.id(+)
     18    And t.r  = i.r(+)
     19    And (a.cod_a Is not null or c.cod_c is not null or i.cod_i is not null)
     20  /
     
            ID CO CO CO
    ---------- -- -- --
         12345 A1 C1 I1
         12345 A2    I2
         12346 A1 C1
         12346    C2

  5. #5
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Natural Join en Oracle 8 ça va être un peu difficile.
    Tout comme les fonctions analytiques

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Elles sont présentes en 8i Enterprise Edition

    Quant au natural join, c'est juste une jointure sans écrire la condition de jointure il me semble.
    Ce qu'il peut manquer c'est le full outer join, mais un left join union right join fait aussi bien !

  7. #7
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    au temps pour moi

  8. #8
    Expert confirmé 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
    Par défaut
    Citation Envoyé par Waldar Voir le message
    ...
    Quant au natural join, c'est juste une jointure sans écrire la condition de jointure il me semble...

    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
    24
    25
    26
    27
     
    Connected to Oracle9i Enterprise Edition Release 9.2.0.5.0 
    Connected as mni
     
    SQL> 
    SQL> Select count(*)
      2    From (Select *
      3           from emp natural join dept
      4          )
      5  /
     
      COUNT(*)
    ----------
            14
     
    SQL> 
    SQL> Select count(*)
      2    From (Select *
      3           from emp , dept
      4          )
      5  /
     
      COUNT(*)
    ----------
            56
     
    SQL>

  9. #9
    Expert confirmé 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
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Tout comme les fonctions analytiques
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    Connected to Oracle8i Enterprise Edition Release 8.1.7.4.0 
    Connected as mni
     
    SQL> 
    SQL> SELECT t.id, a.cod_a, c.cod_c, i.cod_i
      2      FROM
      3      (SELECT id, r FROM t_tab, pivot
      4      ) t,
      5      (SELECT id, cod_a, row_number() over (partition BY id ORDER BY cod_a) r
      6         FROM t_act
      7      ) a,
      8      (SELECT id, cod_c, row_number() over (partition BY id ORDER BY cod_c) r
      9         FROM t_canal
     10      ) c,
     11      (SELECT id, cod_i, row_number() over (partition BY id ORDER BY cod_i) r
     12      FROM t_ip) i
     13    WHERE t.id = a.id(+)
     14      AND t.r  = a.r(+)
     15      AND t.id = c.id(+)
     16      AND t.r  = c.r(+)
     17      AND t.id = i.id(+)
     18      AND t.r  = i.r(+)
     19      AND (a.cod_a IS NOT NULL OR c.cod_c IS NOT NULL OR i.cod_i IS NOT NULL)
     20  /
     
            ID COD_A COD_C COD_I
    ---------- ----- ----- -----
         12345 A1    C1    I1
         12345 A2          I2
         12346 A1    C1    
         12346       C2    
     
    SQL>

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    "sans avoir à préciser la condition de jointure qu'il va détecter tout seul" aurait été plus approprié.

    Ca reste une syntaxe que je n'apprécie pas car elle ne peut qu'induire des bugs et/ou incompréhension.

  11. #11
    Expert confirmé 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
    Par défaut
    Citation Envoyé par Waldar Voir le message
    "sans avoir à préciser la condition de jointure qu'il va détecter tout seul" aurait été plus approprié.
    ...
    Oui, mais c’est important parce que CARTESIAN JOIN on peut faire dans toutes les versions d’Oracle par contre Natural Join seulement à partir de la version 9.

    ...
    Ca reste une syntaxe que je n'apprécie pas car elle ne peut qu'induire des bugs et/ou incompréhension.
    Nous sommes d'accord

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Oui, mais c’est important parce que CARTESIAN JOIN on peut faire dans toutes les versions d’Oracle
    CROSS JOIN en écriture normalisée

  13. #13
    Expert confirmé 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
    Par défaut
    Citation Envoyé par Waldar Voir le message
    CROSS JOIN en écriture normalisée
    Oui, CROSS JOIN comme vous dite.

Discussions similaires

  1. [AC-2010] Probleme avec les produits cartésiens
    Par marcus crassus dans le forum Access
    Réponses: 4
    Dernier message: 06/08/2014, 08h27
  2. [VxiR2] Identifier les produits cartésiens
    Par Burt67 dans le forum Webi
    Réponses: 3
    Dernier message: 17/08/2011, 10h06
  3. Réponses: 4
    Dernier message: 13/08/2004, 18h39
  4. [langage] 2 fichier dans 1 en evitant les doublons
    Par remixxl dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2004, 17h05
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04

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