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 :

Resultat d'une requete imbriqué


Sujet :

SQL Oracle

  1. #21
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    je ne vois pas ou tu as une problematique pour faire le changement dans la requete que je t'ai envoye. c'est tres simple
    Tu as toutes les clees en main:
    Essaye de comprendre la requete suivante en la decomposant/executant bout par bout:

    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
     
    CREATE TABLE TONSELECT ("NOM_PARENT" VARCHAR2(20), "NOM_ENFANT" VARCHAR2(20),"NBPETITENFANTS" NUMBER(10,0));
    INSERT INTO TONSELECT (NOM_PARENT,NOM_ENFANT,NBPETITENFANTS) VALUES ('parent1','enfant1',3);
    INSERT INTO TONSELECT (NOM_PARENT,NOM_ENFANT,NBPETITENFANTS) VALUES ('parent1','enfant2',0);
    INSERT INTO TONSELECT (NOM_PARENT,NOM_ENFANT,NBPETITENFANTS) VALUES ('parent1','enfant3',1);
    INSERT INTO TONSELECT (NOM_PARENT,NOM_ENFANT,NBPETITENFANTS) VALUES ('parent2','enfant4',2);
    INSERT INTO TONSELECT (NOM_PARENT,NOM_ENFANT,NBPETITENFANTS) VALUES ('parent2','enfant5',2);
     
    WITH
      FLT_JOIN AS (
        SELECT NOM_PARENT,LTRIM(SYS_CONNECT_BY_PATH(NOM_ENFANT,','),',') NOM_ENFANTS
        FROM (
          SELECT 
            NOM_PARENT
            ,NOM_ENFANT
            ,ROW_NUMBER() OVER (PARTITION BY NOM_PARENT ORDER BY NOM_ENFANT) rn
            ,COUNT(*) OVER (PARTITION BY NOM_PARENT) cnt
          FROM TONSELECT
          )
        WHERE rn=cnt
        START WITH rn=1
        CONNECT BY PRIOR NOM_PARENT = NOM_PARENT AND PRIOR rn = rn-1
        )
    SELECT FLT_JOIN.NOM_PARENT,FLT_JOIN.NOM_ENFANTS,SUM(NBPETITENFANTS)
    FROM FLT_JOIN
    JOIN TONSELECT ON FLT_JOIN.NOM_PARENT=TONSELECT.NOM_PARENT
    GROUP BY FLT_JOIN.NOM_PARENT,FLT_JOIN.NOM_ENFANTS;
    ---
    Farid

  2. #22
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 77
    Points
    77
    Par défaut
    C'est bon, la requete, je l'avais adapté, j'avais juste une incohérence dans mes données. J'avais oublié un distinct

    Pour Information uniquement. Voici ma requete final

    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
    WITH
      MONSELECT AS(
        select 
        count(resultat.resultatid) as population,
        mesure.mesureCode,
        mesure.mesureDesc,
        etape.etapeCode,
        etape.etapeDesc,
        moyen.moyenid,
        moyen.moyenname,
        ROW_NUMBER() OVER (PARTITION BY mesure.mesureCode,etape.etapeCode ORDER BY moyen.moyenName) rn,
        COUNT(*) OVER (PARTITION BY mesure.mesureCode,etape.etapeCode) cnt
        from GWTMESURE mesure
        LEFT OUTER JOIN GWTETAPE etape on mesure.EtapeID=etape.EtapeId 
        LEFT OUTER JOIN GWTRESULTATTEST resultat on etape.ResultatId=resultat.ResultatId 
        LEFT OUTER JOIN GWTMOYEN moyen on resultat.moyenId=moyen.moyenId 
        LEFT OUTER JOIN GWTNUMSERIE numSerie on resultat.NumSerieId=numSerie.NumSerieId 
        WHERE moyen.FactoryId='1' 
        AND numSerie.ArticleId NOT IN(SELECT bl.articleId FROM GWRUSINENOTARTICLE bl WHERE FactoryId='1') 
        AND mesure.mesurecode!='STATUT' AND mesure.mesurecode!='DUREE' 
        GROUP BY moyen.moyenid,moyen.moyenname,mesure.mesureCode,mesure.mesureDesc,etape.etapeCode,etape.etapeDesc
        ORDER BY mesure.mesureCode,etape.etapeCode
      ),
      FLT_JOIN AS (
        SELECT DISTINCT mesureCode,mesureDesc,etapeCode,etapeDesc,LTRIM(SYS_CONNECT_BY_PATH(moyenname,','),',') moyenname
        FROM MONSELECT
        WHERE rn=cnt
        START WITH rn=1
        CONNECT BY PRIOR mesureCode = mesureCode AND etapeCode=etapeCode AND PRIOR rn = rn-1
        )
    SELECT FLT_JOIN.mesureCode,FLT_JOIN.mesureDesc,FLT_JOIN.etapeCode,FLT_JOIN.etapeDesc,FLT_JOIN.moyenname,SUM(MONSELECT.population) population
    FROM FLT_JOIN
    JOIN MONSELECT ON (FLT_JOIN.mesureCode=MONSELECT.mesureCode AND FLT_JOIN.etapeCode=MONSELECT.etapeCode)
    GROUP BY FLT_JOIN.mesureCode,FLT_JOIN.mesureDesc,FLT_JOIN.etapeCode,FLT_JOIN.etapeDesc,FLT_JOIN.moyenname

  3. #23
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    eh beh ca commence a faire une belle requete dis moi !

    bonne continuation.
    ---
    Farid.

  4. #24
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 77
    Points
    77
    Par défaut
    Juste une toute petite question encore, stp

    La requete MONSELECT est généré selon plusieurs critère côté java.
    Est-ce que je peut laisser le reste côté oracle dans une procédure, une vue, du pl/sql.
    Pasque si je dois générer ca côté java, c'a va devenir ingérable.

    j'aimerais plus appelé quelques chose du genre

    maFonctiondeRegroupement(MONSELECT) et que ca me retourne le résultat?

    Est-ce que ca existe déjà? Ou créer le MONSELECT dans une vue temporaire? create TMP_VIEW AS(MONSELECT)

    et après travailler dessus

  5. #25
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    Je n'utilise pas les vues, mais je suppose que tu peux le faire, ou meme via des fonctions ou une procedure.
    Il faut juste faire gaffe car tu rajoutes une dependance sur la facon dont est construite ta base.
    Donc le jour ou tu (ou quelqu'un d'autres) remontes une nouvelle base, il ne faut pas oublier de recreer les vues/fonctions/procedure au risque de planter l'application.
    En general je prefere eviter ce genre de contrainte d'installation sur une base, car tu peux etre certain qu'il manquera des choses dans une reinstalle. (les lois de murphy.. If anything can go wrong, IT WILL !)

    Toutes mes requetes (aussi generees en java) je prefere les gerer de java pour l'application liee.

    ---
    Farid

  6. #26
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 77
    Points
    77
    Par défaut
    Je viens de regarder différentes pistes et au final, je crois que ca ne va pas simplifier le code mais juste reporter la difficulté sur oracle. Je serai un expert Oracle, je pense que je l'aurais fait mais je ne le suis pas

    De plus, tu as raison de dire que l'application devient dependante des mise à jour de la base.

    En tout cas, merci. J'en ai surement appris plus en ces 2 jours qu'en 5 ans d'études.

  7. #27
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Citation Envoyé par Farid_92 Voir le message
    Je n'utilise pas les vues, mais je suppose que tu peux le faire, ou meme via des fonctions ou une procedure.
    Il faut juste faire gaffe car tu rajoutes une dependance sur la facon dont est construite ta base.
    Donc le jour ou tu (ou quelqu'un d'autres) remontes une nouvelle base, il ne faut pas oublier de recreer les vues/fonctions/procedure au risque de planter l'application.
    En general je prefere eviter ce genre de contrainte d'installation sur une base, car tu peux etre certain qu'il manquera des choses dans une reinstalle. (les lois de murphy.. If anything can go wrong, IT WILL !)

    Toutes mes requetes (aussi generees en java) je prefere les gerer de java pour l'application liee.

    ---
    Farid
    Vous allez chagrinez tout le monde ici si vous dites que vous avez peur des migrations pour une vue ou une fonction.

    un export full d'un schema suffit pout tout avoir( tables,indexes,contraintes,packages,fonctions ....)

    sans parler d'un dbms_metadata, et autres outils genre TOAD pour faire du reverse engeneering !

    Qu'est ce qui va se passer si vous migrez de Java vers un autre outils(.NEt..), si quelqu'un efface par erreur les code java ....

  8. #28
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    Salut fatsora,

    Je m'attendais a ce qu'une personne me reprenne sur ce coup la et je le merite

    Plus serieusement, il ne faut pas generaliser ce que j'ai dis.
    Il y a de nombreux cas ou il est preferable (voir recommande) d'avoir des fonctionnalites implementées directement en base.

    Par contre j'essaye de faire la distinction entre les process qui sont intrinseques aux données et les process qui sont specifiques a une application.

    Dans le premier cas, il est tout a fait normale d'implementer ces process dans la base.
    Dans le deuxieme cas, la dependance etant liee a l'application qui a un besoin particulier par rapport a d'autres applications qui attaquerait la meme base, je pense qu'il est bien plus judicieux de les implementer dans l'application.

    Voila, j'espere que j'ai ete un peu plus clair

    ---
    Farid.

  9. #29
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonsoir,

    En tout cas ,c'est cool de voir des gens qui ont de l'humour ici !


Discussions similaires

  1. substr sur le $resultat d'une requete
    Par grellierj dans le forum Langage SQL
    Réponses: 12
    Dernier message: 21/01/2005, 11h28
  2. Réponses: 2
    Dernier message: 29/11/2004, 12h13
  3. Equivalent d'une requete imbriquée ??
    Par webtheque dans le forum Requêtes
    Réponses: 8
    Dernier message: 31/08/2004, 10h07
  4. Syntaxe pour avoir un seul resultat dans une requete
    Par Pompil dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/09/2003, 15h51
  5. [VB6] [Excel] Résultat d'une requete ds une feuille
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 07/01/2003, 17h52

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