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

Langage SQL Discussion :

Problème sous-requête


Sujet :

Langage SQL

  1. #1
    Inactif  
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 18
    Points
    18
    Par défaut Problème sous-requête
    Bonjour

    J'ai besoin de votre aide pour effectuer ma requête qui comprend une sous requête. Je vous explique :

    J'ai des employés qui on un numéro, une table 'PREALISE' avec des informations et surtout une date de réalisation et une table 'PPREVISIONNEL' avec les memes informations et la date prévisionnel de réalisation.

    Je souhaiterais récupérer les informations de PPREVISIONNEL a partir de la date max de PREALISE pour chaque employé (la date max de PREALISE est différente selon les employés).

    Cela donnerai quelque chose comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT
    EMPLOYE.NUMEMP,	
    PPREVIS.DATE
    
    FROM 
    PPREVIS,	
    EMPLOYE
    
    WHERE 
    EMPLOYE.NUMEMP	=	PPREVIS.NUMEMP
    AND
    
    PPREVIS.DATE > (SELECT MAX(DATE) FROM PREALISE WHERE NUMEMP = ????)
    Je souhaiterais donc remplacer les ? par le numéro de l'employé sur lequel la requête est en train de bouclé.

    J'espère m'être fait comprendre.

    Merci d'avance.
    Cordialement
    Yoan

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 392
    Points
    28 392
    Par défaut
    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT  employe.numemp
        ,   pprevis.date
    FROM    pprevis
        INNER JOIN	
            employe
            ON  employe.numemp	=	pprevis.numemp
    WHERE   EXISTS 
            (   SELECT  NULL    
                FROM    prealise     
                WHERE   pprevis.numemp  = prealise.numemp
                HAVING  pprevis.date    > MAX(prealise.date)
            )
    ;

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 240
    Points : 12 872
    Points
    12 872
    Par défaut
    Bonjour,
    Il est possible d'utiliser une sous-requête corrélée:
    Code SLQ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT
    EMPLOYE.NUMEMP,	
    PPREVIS.DATE
    FROM 
    EMPLOYE
    inner join PPREVIS on EMPLOYE.NUMEMP = PPREVIS.NUMEMP
    WHERE 
    PPREVIS.DATE > (SELECT MAX(DATE) FROM PREALISE WHERE NUMEMP = EMPLOYE.NUMEMP)
    On peut aussi utiliser une jointure, qui sera peut-être plus performante:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT
    EMPLOYE.NUMEMP,	
    PPREVIS.DATE
    FROM 
    EMPLOYE
    inner join PPREVIS on EMPLOYE.NUMEMP = PPREVIS.NUMEMP
    left outer join PREALISE on PREALISE.NUMEMP = EMPLOYE.NUMEMP and PREALISE.DATE >= PPREVIS.DATE
    WHERE 
    PREALISE.EMPLOYE.NUMEMP is null

    Tatayo.

  4. #4
    Inactif  
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Déjà merci pour vos réponses.

    Cependant, aucune d'entre elles n'a fonctionné.

    Citation Envoyé par al1_24 Voir le message
    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT  employe.numemp
        ,   pprevis.date
    FROM    pprevis
        INNER JOIN	
            employe
            ON  employe.numemp	=	pprevis.numemp
    WHERE   EXISTS 
            (   SELECT  NULL    
                FROM    prealise     
                WHERE   pprevis.numemp  = prealise.numemp
                HAVING  pprevis.date    > MAX(prealise.date)
            )
    ;
    Elle ne fonctionne pas et en plus je ne comprend pas trop ce que fait le having alors qu'il n'y a pas de group by ...?

    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Il est possible d'utiliser une sous-requête corrélée:
    Code SLQ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT
    EMPLOYE.NUMEMP,	
    PPREVIS.DATE
    FROM 
    EMPLOYE
    inner join PPREVIS on EMPLOYE.NUMEMP = PPREVIS.NUMEMP
    WHERE 
    PPREVIS.DATE > (SELECT MAX(DATE) FROM PREALISE WHERE NUMEMP = EMPLOYE.NUMEMP)
    On peut aussi utiliser une jointure, qui sera peut-être plus performante:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT
    EMPLOYE.NUMEMP,	
    PPREVIS.DATE
    FROM 
    EMPLOYE
    inner join PPREVIS on EMPLOYE.NUMEMP = PPREVIS.NUMEMP
    left outer join PREALISE on PREALISE.NUMEMP = EMPLOYE.NUMEMP and PREALISE.DATE >= PPREVIS.DATE
    WHERE 
    PREALISE.EMPLOYE.NUMEMP is null

    Tatayo.
    Les 2 ne fonctionnent pas non plus : elles chargent sans fin.
    Pour la 2ème je ne comprend pas "PREALISE.EMPLOYE.NUMEMP is null" Quel est la signification de cela ?
    Merci

  5. #5
    Inactif  
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    En fait peut etre en prenant le problème dans un autre sens ce sera plus facil :

    Je souhaite récupérer toutes les données de la table PREALISE à partir du premier janvier de l'année en cours
    Puis récupérer toutes les données de la table PPREVISIONNEL à partir la date à laquelle on s'est arrété pour le réalisé.

    Actuellement, je fait une Union ALL de cette facon :

    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
    SELECT
    EMPLOYE.NUMEMP AS NUMEMP,	
    PPREVIS.DATE AS DATE,	
    PPREVIS.HEUREDP AS HEUREDP,
    PPREVIS.HEUREFP AS HEUREFP,
    PPREVIS.NUMTYPEH AS NUMTYPEH,	
    EMPLOYE.NOMEMP AS NOMEMP,	
    EMPLOYE.PREEMP AS PREEMP,
    'PP' AS TYPE
    
    FROM 
    EMPLOYE
    INNER JOIN PPREVIS ON EMPLOYE.NUMEMP = PPREVIS.NUMEMP
    
    WHERE 
    
    PPREVIS.DATE > (SELECT MAX(DATE) FROM PREALISE WHERE NUMEMP = ????)
    AND PPREVIS.NUMTYPEH IN ('31', '32')
    
    
    UNION ALL
    
    SELECT 
    EMPLOYE.NUMEMP AS NUMEMP,	
    PREALISE.DATE AS DATE,	
    PREALISE.HEUREDR AS HEUREDR,
    PREALISE.HEUREFR AS HEUREFR,
    PREALISE.NUMTYPEH AS NUMTYPEH,	
    EMPLOYE.NOMEMP AS NOMEMP,	
    EMPLOYE.PREEMP AS PREEMP,
    'PR' AS TYPE
    
    FROM 
    PREALISE	
    INNER JOIN EMPLOYE ON EMPLOYE.NUMEMP = PREALISE.NUMEMP
    
    WHERE
    PREALISE.DATE>= '20130101'
    AND PREALISE.NUMTYPEH IN ('31', '32')
    
    ORDER BY 
    NUMEMP,
    DATE,
    TYPE

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 392
    Points
    28 392
    Par défaut
    Citation Envoyé par Yooo84 Voir le message
    Elle ne fonctionne pas et en plus je ne comprend pas trop ce que fait le having alors qu'il n'y a pas de group by ...?
    On peut faire des regroupements sans utiliser GROUP BY... si le regroupement s'effectue sur l'intégralité des lignes sélectionnées; ici, toutes les lignes de prealise pour lesquelles pprevis.numemp = prealise.numemp.

    Ensuite, "Elle ne fonctionne pas" c'est un peu court comme description pour comprendre ce qui ne convient pas.
    Il y a un message d'erreur ? Le résultat ne correspond pas à tes attentes ?

    Par ailleurs, tu n'as pas précisé quel SGBD tu utilisais.

  7. #7
    Inactif  
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Oui désolé pour le manque d'informations

    J'utilise HYPERFILESQL comme SGBD. Je développe des Etats avec WINDEV

    Lorsque je lance la requete, j'ai une erreur :

    Erreur renvoyée par le serveur <SvHordyplanTest:4900> :
    Erreur interne à la DLL WDSQL.
    Encore merci

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 240
    Points : 12 872
    Points
    12 872
    Par défaut
    Citation Envoyé par Yooo84 Voir le message
    Les 2 ne fonctionnent pas non plus : elles chargent sans fin.
    Peut-être un problème d'indexes ? Il faudrait déjà essayer avec 1 employé précis pour voir si la requête renvoie le bon résultat ou pas.
    Citation Envoyé par Yooo84 Voir le message
    Pour la 2ème je ne comprend pas "PREALISE.EMPLOYE.NUMEMP is null" Quel est la signification de cela ?
    C'est une autre façon de faire. Au lieu de chercher les lignes de PPREVIS dont la date est supérieure à toutes celle de PREALISE (pour un même employé), la requête cherche tous les PPREVIS pour lesquels il n'existe pas de PREALISE avec une date supérieure ou égale.

    Tatayo.

  9. #9
    Inactif  
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Peut-être un problème d'indexes ? Il faudrait déjà essayer avec 1 employé précis pour voir si la requête renvoie le bon résultat ou pas.
    Non pas de problème d'indexes j'ai essayé pour 1 employé ca ne marche toujours pas.

    Citation Envoyé par tatayo Voir le message
    C'est une autre façon de faire. Au lieu de chercher les lignes de PPREVIS dont la date est supérieure à toutes celle de PREALISE (pour un même employé), la requête cherche tous les PPREVIS pour lesquels il n'existe pas de PREALISE avec une date supérieure ou égale.

    Tatayo.
    Ok je ne savais pas.


    Une autre idée ??

    Merci

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 240
    Points : 12 872
    Points
    12 872
    Par défaut
    Citation Envoyé par Yooo84 Voir le message
    Non pas de problème d'indexes j'ai essayé pour 1 employé ca ne marche toujours pas.
    Est-ce qu'on peut avoir la description des tables et des indexes ?

    Tatayo.

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

Discussions similaires

  1. Problème sous-requête complexe
    Par Soucmic dans le forum Développement
    Réponses: 11
    Dernier message: 02/05/2013, 08h51
  2. Problème sous requête
    Par darkloy dans le forum Requêtes
    Réponses: 5
    Dernier message: 29/01/2012, 21h35
  3. Problème sous-requête MAX et COUNT
    Par grafistolage dans le forum Requêtes
    Réponses: 6
    Dernier message: 06/07/2010, 09h08
  4. Problème Sous-Requête
    Par STEF_1 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 13/01/2006, 13h12
  5. problème sous-requête SQL et order by
    Par aguest dans le forum Requêtes
    Réponses: 10
    Dernier message: 26/12/2005, 23h57

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