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 :

Produit cartésien conditionnel


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Par défaut Produit cartésien conditionnel
    Bonjour,

    Voila, je bute sur un problème et je ne trouve pas ma solution qui est peut-être très simple !

    Avant tout, je vous mets un exemple simplifié de ce que j'ai en MPD, je ne peux pas agir dessus, mais juste le subir !
    Je sais que ce n'est pas bien ... Mais pas le choix ... lol

    Alors j'ai :

    Une table SOUSTRAITANCE qui contient des pièces en colonnes, par exemple les colonnes DEMANDEUR, MENAGE, LOGISTIQUE, RESTAURATION

    Une autre table CHANGEMENTS qui contient comme colonnes TYPE, AVANT, APRES, DATE

    Il n'y à AUCUNE contrainte d'intégrité

    Quand un changement opère, une société de sous-traitance se fait racheter ou change.

    Aussi quelques exemples :

    SOUSTRAITANCE ('OPEL', 'M1', 'L1', 'R1')
    SOUSTRAITANCE ('FORD', 'M1', 'L3', 'M1')
    -> Ici l'entreprise OPEL soustraite le ménage à M1, la logistique à L1 et la restauration ) R1 ...
    -> Même raisonnement pour FORD
    Ensuite :
    CHANGEMENTS ('MENAGE', 'M1', 'M2', '01/01/2014')
    CHANGEMENTS ('RESTAURATION', 'R1', 'R2', '01/07/2013')
    -> Ici toutes les soustraitances qui ont M1 en MENAGE auront donc M2 à partir du 01/01/2014
    -> Même raisonnement pour la RESTAURATION
    -> Pas de changements pour la LOGISTIQUE
    Je souhaiterais le résultat suivant :

    'OPEL', 'MENAGE', 'M1', 'M2', '01/01/2014'
    'OPEL', 'LOGISTIQUE', NULL, NULL, NULL
    'OPEL', 'RESTAURATION', 'R1', 'R2', '01/07/2013'
    'FORD', 'MENAGE', 'M1', 'M2', '01/01/2014'
    'FORD', 'LOGISTIQUE', NULL, NULL, NULL
    'FORD', 'RESTAURATION', 'M1', 'M2', '01/01/2014'
    Donc à savoir, pour CHAQUE ligne de SOUSTRAITANCE, je veux un produit cartésien pour CHAQUE TYPE avec des données s'il y en a, sinon des NULL ... Mais le TYPE, lui est toujours bien présent !!! (liste CONNUE de types)

    Mon souci est que chacune de mes 2 tables ici est pour moi un gros ensemble de jointures, donc les performances sont au coeur du souci !!!!!

    Merci à vous pour l'aide !

  2. #2
    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
    Quel est votre SGBD ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Par défaut
    Oups j'ai oublié de préciser ...

    C'est du Oracle 11g.

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Voici une approche pas top :
    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
    SQL> with SOUSTRAITANCE as (
      2  select 'OPEL' as DEMANDEUR, 'M1' as MENAGE, 'L1' as LOGISTIQUE, 'R1' as RESTAURATION from dual union all
      3  select 'FORD'             , 'M1'          , 'L3'              , 'R1'                 from dual
      4  ),
      5         CHANGEMENTS as (
      6  select 'MENAGE' as TYPE, 'M1' as AVANT, 'M2' as APRES, '01/01/2014' as DAT from dual union all
      7  select 'RESTAURATION'  , 'R1'         , 'R2'         , '01/07/2013'         from dual
      8  ),
      9         stt2 as (
     10  select demandeur, 'MENAGE' as type, MENAGE as val from soustraitance union all
     11  select demandeur, 'LOGISTIQUE' as type, LOGISTIQUE as val from soustraitance union all
     12  select demandeur, 'RESTAURATION' as type, RESTAURATION as val from soustraitance
     13  )
     14  select s.demandeur, s.type, c.avant, c.apres, c.dat
     15    from stt2 s
     16    left join changements c on c.type = s.type and c.avant = s.val
     17   order by demandeur, type;
     
    DEMA TYPE         AV AP DAT
    ---- ------------ -- -- ----------
    FORD LOGISTIQUE
    FORD MENAGE       M1 M2 01/01/2014
    FORD RESTAURATION R1 R2 01/07/2013
    OPEL LOGISTIQUE
    OPEL MENAGE       M1 M2 01/01/2014
    OPEL RESTAURATION R1 R2 01/07/2013
     
    6 rows selected.
     
    SQL>

  5. #5
    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
    Pas vraiment différent de la solution de skuatamad, et ne fonctionne qu'à partir de la version 11g :
    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
    WITH SOUSTRAITANCE AS
    (
    SELECT 'OPEL' AS DEMANDEUR, 'M1' AS MENAGE, 'L1' AS LOGISTIQUE, 'R1' AS RESTAURATION FROM dual union ALL
    SELECT 'FORD'             , 'M1'          , 'L3'              , 'M1'                 FROM dual
    )
      ,  CHANGEMENTS AS
    (
    SELECT 'MENAGE' AS TYPE, 'M1' AS AVANT, 'M2' AS APRES, '01/01/2014' AS DAT FROM dual union ALL
    SELECT 'RESTAURATION'  , 'R1'         , 'R2'         , '01/07/2013'        FROM dual
    )
        select S.demandeur, S.type, C.avant, C.apres, C.dat
          from soustraitance UNPIVOT (valeur FOR type IN (MENAGE AS 'MENAGE', LOGISTIQUE AS 'LOGISTIQUE', RESTAURATION AS 'RESTAURATION')) S
     left join CHANGEMENTS C on C.avant = S.valeur
      order by S.demandeur asc, S.type asc;
     
    DEMANDEUR TYPE         AVANT APRES DAT
    --------- ------------ ----- ----- ----------
    FORD      LOGISTIQUE   
    FORD      MENAGE       M1    M2    01/01/2014
    FORD      RESTAURATION M1    M2    01/01/2014
    OPEL      LOGISTIQUE   
    OPEL      MENAGE       M1    M2    01/01/2014
    OPEL      RESTAURATION R1    R2    01/07/2013

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Par défaut
    SUPER !!!

    Je n'avais pas vu les choses comme ça ... Mais c'est magique !

    J'étais arrivé à une solution en utilisant un CROSS JOIN puis un LEFT JOIN sur un DECODE ...

    Cela me satisfait, mais je vais dès que possible remplacer ma solution par le UNPIVOT qui me parait meilleure niveau perf et aussi plus simple finalement !

    Je vous remercie pour la solution !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Obtenir un produit cartésien
    Par pc75 dans le forum Excel
    Réponses: 10
    Dernier message: 07/04/2014, 08h51
  2. Produit cartésien sous Excel
    Par Olive_08 dans le forum Excel
    Réponses: 2
    Dernier message: 23/04/2008, 08h24
  3. Produit cartésien au lieu d'une jointure
    Par Smix007 dans le forum Débuter
    Réponses: 1
    Dernier message: 17/04/2008, 14h50
  4. [V 6.5.1] Produit cartésien
    Par pc75 dans le forum Deski
    Réponses: 7
    Dernier message: 10/07/2007, 10h17
  5. Réponses: 10
    Dernier message: 12/07/2006, 13h00

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