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 :

Comment trier entre deux vues


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 38
    Par défaut Comment trier entre deux vues
    Bonjour à tous, je suis de niveau très "newbie" en SQL et j'ai à créer un requête qui me permettrait de comparer deux vues pour retirer un bassin de donnée.

    Par exemple j'ai les vue Table 1 et Table 2 dans lesquels je dois comparer si un numéro de projet existe ou non.

    Mon problème est que dans la "table 1" le numéro de projet est l'agencement des données de 3 colonnes soit :"COD, ANNEE, SEQ" et que dans la table deux le numéro de projet est dans la colonne "PROJET".

    Comment savoir si un numéro de projet est dans la table 1 et n'est pas dans la table 2 et vice versa...

  2. #2
    Invité
    Invité(e)
    Par défaut
    avec le peu d'information que tu nous livres, j'imaginerais un truc dans ce genre :

    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
    select 
    table1.COD || table1.ANNEE || table1.SEQ PROJET
    from table1
    minus 
    select 
    table2.projet
    from table2;
     
    et
     
    select 
    table2.projet
    from table2
    minus 
    select 
    table1.COD || table1.ANNEE || table1.SEQ PROJET
    from table1 ;
    en supposant que ton PROJET est construit par la concaténation suivante :
    table1.COD || table1.ANNEE || table1.SEQ

  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
    Vous pouvez faire avec MINUS ou NOT EXISTS ou une jointure externe.

    Minus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select COD || ANNEE || SEQ from table1
    minus
    select PROJET from table2;
     
    select PROJET from table2
    minus
    select COD || ANNEE || SEQ from table1;
    Not exists
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select * from table1 t1
    where not exists (select null from table2 t2
                      where t2.PROJET = t1.COD || t1.ANNEE || t1.SEQ);
     
    select * from table2 t2
    where not exists (select null from table1 t1
                      where t2.PROJET = t1.COD || t1.ANNEE || t1.SEQ);
    Jointure externe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select
        coalesce(t1.COD || t1.ANNEE || t1.SEQ, t2.PROJET) as proj_t1,
        coalesce(t2.PROJET, t1.COD || t1.ANNEE || t1.SEQ) as proj_t2
    from
        table1 t1
        full outer join table2 t2
          on t2.PROJET = t1.COD || t1.ANNEE || t1.SEQ
    where
        coalesce(t1.COD || t1.ANNEE || t1.SEQ, t2.PROJET) <> coalesce(t2.PROJET, t1.COD || t1.ANNEE || t1.SEQ)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 38
    Par défaut Le cas exact
    Je vais vous résumer le cas exact avec les noms de vue et les colonnes à utiliser.

    J'ai la vue UTI_V_PROJT qui comporte les colonnes COD_PROJT;ANNEE_PROJT et SEQ_PROJT. Ces trois colonnes concaténées forme le numéro de projet.

    Dans la vue MNT_PROJT j'ai la colonne PROJET qui représente le numéro de projet.

    Ces deux vues me sont utiles pour différents indices de suivi. Par contre dans un j'ai les projets en démarrage et dans l'autre en cours d'exécution. Ce qui a pour effet que j'ai des projets qui sont dans un et non dans l'autre. Ma requête SELECT a pour but de me faire ressortir les projets qui sont dans UTI et non dans MNT (et vice versa).

    J'ai essayé les SELECT proposé par Jérôme_MTL et ça m'a donné comme résultat la concaténation de mes numéros de projet sans me représenter toutes les autres valeurs de la table. J'ai donc utilisé la formule Not Exists proposé par Waldar qui a répondu à ce que j'avais besoin.

    J'ai exécuté la requête :

    SELECT * FROM UTI_V_PROJT
    WHERE NOT EXISTS (SELECT NULL FROM MNT_PROJT
    WHERE PROJET=COD_PROJT || ANNEE_PROJT || SEQ_PROJT);

    J'aimerais maintenant ajouter une partie à la requête qui me permettrait d'éliminer du résultats les projets qui ne comporte pas de donnée dans la colonne PRIORITE. Est-ce que j'ajoute un MINUS SELECT NULL FROM à la formule?

  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
    Il suffit de rajouter une condition dans le filtre. Comme vous avez deux tables dans la requête je vous conseille fortement de les aliaser, ça facilite énormément la relecture et la compréhension de la requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * FROM UTI_V_PROJT u
    WHERE NOT EXISTS (SELECT NULL FROM MNT_PROJT m
                      WHERE m.PROJET= u.COD_PROJT || u.ANNEE_PROJT || u.SEQ_PROJT)
    AND u.PRIORITE is not null

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 38
    Par défaut Solution finale utilisée
    Merci beaucoup de votre aide elle m'a mis sur la piste.

    J'ai toutefois créé cette requête qui me permet de filtrer les projets existant dans UTIL et non dans MNT et d'en sortir ceux qui sont renseigné dans priorité. J'en conviens elle est un brin longue mais elle me permet de garder un gabarit dans lequel je modifierai les WHERE si jamais j'ai besoin de créer un nouveau filtre.

    Donc voici ma solution

    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
    SELECT *
     
    FROM 
     
        (SELECT 
     
            CONCAT(CONCAT(COD_PROJT, ANNEE_PROJT), SEQ_PROJT) AS NO_PROJET,
     
            IDE_PROJT,
            COD_PROJT,
            ANNEE_PROJT,
            SEQ_PROJT,
            NOM_PROJT,
            CAT_PROJT,
            COD_TYPE_PROJT,
            STA_PROJT, 
            IND_PROJT_SAGIR, 
            DES_PROJT, 
            DAT_DEBUT_APPLQ, 
            DAT_FIN_APPLQ, 
            DAT_DEBUT_EFFCF_SAGIR, 
            DAT_FIN_EFFCF_SAGIR, 
            COD_STAT_VALR_ACTV, 
            MNT_ESTM_PROJT, 
            STA_CAPTL_PROJT, 
            IND_POINT_CTRL_ATTND,  
            DAT_MISE_SERVC_REEL, 
            COM_PROJT, 
            IND_BUDGT_PERMS, 
            IND_REPOR_PERMS, 
            NOM_GROP_HIERC, 
            NUM_UTILS_CHEF_PROJT, 
            COD_UNITE_ADMNS_RESPN, 
            COD_NIV_HIERC_1, 
            COD_NIV_HIERC_2, 
            COD_NIV_HIERC_3, 
            COD_NIV_HIERC_4, 
            DAT_DEBUT_UNITE_ADMNS, 
            COD_UNITE_ADMNS_LOCLS, 
            COD_UNITE_ADMNS_FINNC, 
            NUM_PROJT_RPC, 
            DAH_CRETN, 
            DAH_MODFC
     
    FROM UTIL.UTIL_V_PROJT       
        ) VUE_UTIL,
     
     
        (SELECT 
     
            ANNEE_AC, 
            ANNEE_TR, 
            AXE, 
            DESC_AXE, 
            ETAT_AC, 
            ETAT_TR,
            PRIORITE
            NUM_PRIRT_DG, 
            NUM_PRIRT_DT, 
            PROJET, 
            TOTAL_AC, 
            TOTAL_TR
     
    FROM MNT.MNT_PROJT
        ) VUE_MNT
     
        	WHERE VUE_MNT.PRIORITE IS NOT NULL 
                 AND VUE_MNT.PROJET = VUE_UTIL.NO_PROJET
     
     
    /
    Encore une fois merci pour l'aide

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/06/2011, 18h55
  2. [AC-2010] comment calculer entre deux limites dans access 2010
    Par ziboua dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 28/12/2010, 20h49
  3. Comment communiquer entre deux fenetres ?
    Par zarohn dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 29/09/2010, 00h14
  4. Réponses: 2
    Dernier message: 29/07/2010, 10h12
  5. Réponses: 6
    Dernier message: 27/08/2008, 10h15

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