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 :

Sous-requête avec LEFT JOIN


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Février 2019
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2019
    Messages : 179
    Par défaut Sous-requête avec LEFT JOIN
    Bonjour,
    Dans la requête ci-dessous je récupère des noms avec la liste associée aux rôles de chaque nom.
    Dans la partie left join avec sous requête, je souhaiterais également récupérer la liste des noms des responsables de chacun.
    J'ai une erreur VALIDERU.MATRI identificateur non valide.
    Merci pour votre aide
    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
    SELECT HOPEMPL.SEITYPPOP,HOPEMPL.MATRI, HOPEMPL.NOMPRE,HOPEMPL.HORSECT, HOPSECH.LIBCOURT, HOPSECH.LIBELLE, HOPEMPL.GROUPH,
    listagg(HOPROLE.UTIL || ' : ' || coalesce(HOPROLE.HORSECT, ' '), '; ')
            within group ( order by HOPROLE.UTIL ) ROL,
    valideur.valideur
    From HOPEMPL, HOPSECH, HOPCTRA, HOPROLE
    LEFT JOIN ( 
    select LISTAGG(x.nompre, '; ' ) WITHIN GROUP (ORDER BY x.nompre) as valideur from
    ( select hopempl.nompre from hopempl ,sfphierd where hopempl.matri = sfphierd.matri ) x
    GROUP By x.nompre
    ) valideur
    on hopmepl.matri = valideur.matri
    WHERE HOPEMPL.HORSECT = HOPSECH.HORSECT
    AND HOPEMPL.MATRI = HOPCTRA.MATRI
    AND SYSDATE Between HOPCTRA.DATDEB and HOPCTRA.DATFIN
    AND HOPEMPL.SEITYPPOP not in ('V',' ', 'I')
    AND HOPEMPL.MATRI not in ('989897','989898','98989826')
    AND HOPEMPL.MATRI = HOPROLE.MATRI
     
    GROUP BY (HOPEMPL.SEITYPPOP,HOPEMPL.MATRI, HOPEMPL.NOMPRE,HOPEMPL.HORSECT, HOPSECH.LIBCOURT, HOPSECH.LIBELLE, HOPEMPL.GROUPH, valideur.valideur)
    ORDER BY HOPEMPL.HORSECT, HOPEMPL.SEITYPPOP

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Bonjour,

    C'est normal d'avoir cette erreur car tu n'as pas de colonne MATRI dans ta vue "valideur".
    De toute façon ta requête est mal conçue, tu mélanges syntaxe Oracle "old style" et syntaxe ANSI.
    Réécris la requête en utilisant uniquement la syntaxe ANSI.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 617
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    a priori il y a un GROUP BY inutile ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    LEFT JOIN  
        (select LISTAGG(x.nompre, '; ' ) WITHIN GROUP (ORDER BY x.nompre) as valideur 
         from (select hopempl.nompre 
               from hopempl, sfphierd 
               where hopempl.matri = sfphierd.matri) x
          GROUP By x.nompre -- ICI
        ) valideur
    De plus, pourquoi coder encore des jointures dans le WHERE, ça ne facilite pas la lecture

  4. #4
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Février 2019
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2019
    Messages : 179
    Par défaut
    Merci pour vos retours mais je connais la méthode ANSI
    J'ai ajouté x.matri dans la vue valideur, mais ça ne fonctionne pas
    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
    SELECT HOPEMPL.SEITYPPOP,HOPEMPL.MATRI, HOPEMPL.NOMPRE,HOPEMPL.HORSECT, HOPSECH.LIBCOURT, HOPSECH.LIBELLE, HOPEMPL.GROUPH,
    listagg(HOPROLE.UTIL || ' : ' || coalesce(HOPROLE.HORSECT, ' '), '; ')
            within group ( order by HOPROLE.UTIL ) ROL,
    valideur.valideur
    From HOPEMPL, HOPSECH, HOPCTRA, HOPROLE
    LEFT JOIN ( 
    select LISTAGG(x.nompre, '; ' ) WITHIN GROUP (ORDER BY x.nompre) as valideur, x.matri from
    ( select hopempl.nompre from hopempl ,sfphierd where hopempl.matri = sfphierd.matri ) x
    GROUP By x.nompre
    ) valideur
    on hopmepl.matri = valideur.matri
    WHERE HOPEMPL.HORSECT = HOPSECH.HORSECT
    AND HOPEMPL.MATRI = HOPCTRA.MATRI
    AND SYSDATE Between HOPCTRA.DATDEB and HOPCTRA.DATFIN
    AND HOPEMPL.SEITYPPOP not in ('V',' ', 'I')
    AND HOPEMPL.MATRI not in ('989897','989898','98989826')
    AND HOPEMPL.MATRI = HOPROLE.MATRI
     
    GROUP BY (HOPEMPL.SEITYPPOP,HOPEMPL.MATRI, HOPEMPL.NOMPRE,HOPEMPL.HORSECT, HOPSECH.LIBCOURT, HOPSECH.LIBELLE, HOPEMPL.GROUPH, valideur.valideur)
    ORDER BY HOPEMPL.HORSECT, HOPEMPL.SEITYPPO

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Tu ne peux pas avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    From HOPEMPL, HOPSECH, HOPCTRA, HOPROLE
    LEFT JOIN (
    Ce n'est pas ANSI. Il faut:
    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
    SELECT HOPEMPL.SEITYPPOP,HOPEMPL.MATRI, HOPEMPL.NOMPRE,HOPEMPL.HORSECT, HOPSECH.LIBCOURT, HOPSECH.LIBELLE, HOPEMPL.GROUPH,
    listagg(HOPROLE.UTIL || ' : ' || coalesce(HOPROLE.HORSECT, ' '), '; ')
            within group ( order by HOPROLE.UTIL ) ROL,
    valideur.valideur
    From HOPEMPL
    JOIN HOPSECH ON HOPEMPL.HORSECT = HOPSECH.HORSECT
    JOIN HOPCTRA ON HOPEMPL.MATRI = HOPCTRA.MATRI
    JOIN HOPROLE ON HOPEMPL.MATRI = HOPROLE.MATRI
    LEFT JOIN ( 
    select LISTAGG(x.nompre, '; ' ) WITHIN GROUP (ORDER BY x.nompre) as valideur from
    ( select hopempl.nompre from hopempl ,sfphierd where hopempl.matri = sfphierd.matri ) x
    GROUP By x.nompre
    ) valideur
    on hopmepl.matri = valideur.matri
    WHERE SYSDATE Between HOPCTRA.DATDEB and HOPCTRA.DATFIN
    AND HOPEMPL.SEITYPPOP not in ('V',' ', 'I')
    AND HOPEMPL.MATRI not in ('989897','989898','98989826');

  6. #6
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Février 2019
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2019
    Messages : 179
    Par défaut
    J'ai toujours l'erreur VALIDEUR.MATRI identificateur non valide
    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
    SELECT HOPEMPL.SEITYPPOP,HOPEMPL.MATRI, HOPEMPL.NOMPRE,HOPEMPL.HORSECT, HOPSECH.LIBCOURT, HOPSECH.LIBELLE, HOPEMPL.GROUPH,
    listagg(HOPROLE.UTIL || ' : ' || coalesce(HOPROLE.HORSECT, ' '), '; ')
            within group ( order by HOPROLE.UTIL ) ROL,
    valideur.valideur
    From HOPEMPL
    JOIN HOPSECH ON HOPEMPL.HORSECT = HOPSECH.HORSECT
    JOIN HOPCTRA ON HOPEMPL.MATRI = HOPCTRA.MATRI and SYSDATE Between HOPCTRA.DATDEB and HOPCTRA.DATFIN
    JOIN HOPROLE ON HOPEMPL.MATRI = HOPROLE.MATRI and SYSDATE Between HOPROLE.DATDEB and HOPROLE.DATFIN
    LEFT JOIN ( 
    select LISTAGG(x.nompre, '; ' ) WITHIN GROUP (ORDER BY x.nompre) as valideur from
    ( select hopempl.nompre from hopempl ,sfphierd where hopempl.matri = sfphierd.matri ) x
    GROUP By x.nompre
    ) valideur
    on hopmepl.matri = valideur.matri
    WHERE 
    HOPEMPL.SEITYPPOP not in ('V',' ', 'I')
    AND HOPEMPL.MATRI not in ('989897','989898','98989826')
    GROUP BY (HOPEMPL.SEITYPPOP,HOPEMPL.MATRI, HOPEMPL.NOMPRE,HOPEMPL.HORSECT, HOPSECH.LIBCOURT, HOPSECH.LIBELLE, HOPEMPL.GROUPH)

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Dans la requête que j'ai reprise il manque l'ajout de x.matri dans la vue valideur, tu peux l'ajouter.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/05/2018, 09h37
  2. Requête avec LEFT JOIN et ORDER BY très lente
    Par defacta dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/10/2016, 01h26
  3. [AC-2007] requête avec LEFT JOIN
    Par redoran dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 15/04/2014, 15h39
  4. Requête avec LEFT JOIN
    Par tom06440 dans le forum Requêtes
    Réponses: 5
    Dernier message: 15/03/2011, 11h02
  5. Réponses: 3
    Dernier message: 06/06/2007, 18h45

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