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

Discussion: Sous requête SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2018
    Messages : 4
    Points : 3
    Points
    3

    Par défaut Sous requête SQL

    Bonjour,

    Pour commencer voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * ,
    (SELECT count(*) FROM (SELECT count(id) FROM testcaserun tcr2 WHERE tcr.statusDateTime >= tcr2.statusDateTime GROUP BY idTestCase) C ) AS nbCasDeTestPlanned
    FROM testcaserun tcr
    Le problème vient du WHERE, la sous-requête ne reconnaît pas tcr déclarer dans la requête globale.
    Comment pourrais-je passer tcr.statusDateTime dans ma sous-requête ?

    L'objectif est d'afficher mes cas de tests ainsi que nbCasDeTestPlanned qui m'indique combien de cas de tests ont une date inférieure pour chaque cas de test.

    Merci pour vos futures réponses

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    4 932
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 4 932
    Points : 10 132
    Points
    10 132

    Par défaut

    Bonjour,

    il ne devrait pas y avoir de problème.

    Quel est le message d'erreur exact ?

    Cependant, je pense qu'il y a bien plus simple pour votre problème, postez un jeu d'essai, et le résultat attendu...

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2018
    Messages : 4
    Points : 3
    Points
    3

    Par défaut

    Merci pour la réponse,

    Le message d’erreur est : Error Code: 1054. Unknown column 'tcr.statusDateTime' in 'where clause'

    En cherchant un peu je me suis aperçu que c'était parce que tcr est déclaré en "Grand-Parent" de la sous-requête, je m'explique

    ->Requête principale

    --->Sous-requête

    ------>Sous-sous-requête

    tcr qui est déclaré dans la requête principale est accessible dans la sous-requête mais pas dans la "sous-sous-requête".
    Seulement je n'ai pas trouvé la solution juste la cause.

    Je pense qu'il y a plus simple seulement je ne suis pas expert en SQL et je n'ai vu que cette manière, mais si vous avez des idées pour mieux construire ma requête je suis preneur

    Merci

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    4 932
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 4 932
    Points : 10 132
    Points
    10 132

    Par défaut

    cela ne devrait pas poser de probléme pourtant

    Quel est votre SGBDR ?

    En revanche, je constate que la colonne count(id) de la "sous-sous requete" n'a pas de nom (dans la table dérivée C)
    Spécifiez un nom pour cette colonne.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2018
    Messages : 4
    Points : 3
    Points
    3

    Par défaut

    Il s'agit d'une base mySQL et j'utilise MySQL Workbench pour les requêtes.

  6. #6
    Modérateur

    Homme Profil pro
    Consultant Teradata
    Inscrit en
    septembre 2008
    Messages
    7 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Teradata

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 692
    Points : 16 033
    Points
    16 033

    Par défaut

    En général, on ne peut descendre les colonnes dans les requêtes corrélées que d'un seul niveau, là vous descendez de deux niveaux et MySQL ne sait pas faire.

    En l'état, votre count(*) extérieur retournera forcément 1.
    Détaillez plutôt votre besoin réel avec un petit jeu de données (10 lignes maximum) représentatif.

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    4 932
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 4 932
    Points : 10 132
    Points
    10 132

    Par défaut

    Le count(*) va plutôt renvoyer le nombre de idTestCase distincts

    Du coup, la requête doit pouvoir s’écrire ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * ,
    (SELECT count(DISTINCT idTestCase) FROM testcaserun tcr2 
      WHERE tcr.statusDateTime >= tcr2.statusDateTime
    ) AS nbCasDeTestPlanned
    FROM testcaserun tcr
    Que l'on peut aussi réécrire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * , count(DISTINCT tcr2.idTestCase) AS nbCasDeTestPlanned
    FROM testcaserun tcr
    LEFT JOIN testcaserun tcr2 
        ON  tcr.statusDateTime >= tcr2.statusDateTime

    voire utiliser les fonctions fenêtrées puisqu'il semble qu'elles soient arrivées dans les dernières version de MySQL

  8. #8
    Modérateur
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    15 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 15 867
    Points : 31 378
    Points
    31 378
    Billets dans le blog
    4

    Par défaut

    1) Il vaut mieux éviter la guerre des étoiles !

    2) Un code indenté et aéré est plus agréable à lire et à déboguer.
    Voici votre requête remise en forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT * ,
    	(
    		SELECT count(*) 
    		FROM 
    		(
    			SELECT count(id) 
    			FROM testcaserun tcr2 
    			WHERE tcr.statusDateTime >= tcr2.statusDateTime 
    			GROUP BY idTestCase
    		) C 
    	) AS nbCasDeTestPlanned
    FROM testcaserun tcr
    La sous-sous requête d'alias C ne va retourner qu'une seule ligne donc le SELECT COUNT(*) de cette sous-requête va retourner 1. Autant directement remplacer tout ça par SELECT /* les colonnes nécessaires et pas étoile */, 1, ce qui, au final, revient à écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT /* les colonnes nécessaires et pas étoile */
    FROM testcaserun


    Le 1 me semblant inutile... mais ce n'est probablement pas ce que vous voulez obtenir.

    L'objectif est d'afficher mes cas de tests ainsi que nbCasDeTestPlanned qui m'indique combien de cas de tests ont une date inférieure pour chaque cas de test.
    Euh...
    Applique la phrase en bleu de ma signature et applique son principe !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    4 932
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 4 932
    Points : 10 132
    Points
    10 132

    Par défaut

    Citation Envoyé par CinePhil Voir le message
    1)
    La sous-sous requête d'alias C ne va retourner qu'une seule ligne donc le SELECT COUNT(*) de cette sous-requête va retourner 1.
    Non, avec le GROUP BY, elle va retourner autant de lignes qu'il y a de idTestCase distincts qui répondent au critère.

  10. #10
    Modérateur
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    15 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 15 867
    Points : 31 378
    Points
    31 378
    Billets dans le blog
    4

    Par défaut

    Arf ! Exact.
    Cela étant, je ne vois pas trop l'intérêt de ramener une série de nombres !

    Le besoin est flou, la requête illisible... bref, je passe la main.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. [CS4] Problème de sous-requêtes SQL avec Dreamweaver
    Par WPH2009 dans le forum Dreamweaver
    Réponses: 5
    Dernier message: 01/04/2009, 18h50
  2. UPDATE et sous requêtes SQL 4
    Par Cylie34 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/04/2007, 17h07
  3. Sous-requêtes SQL pour ACCESS
    Par bastoon dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/08/2006, 21h41
  4. 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
  5. Sous-requêtes SQL
    Par mandrake256 dans le forum WinDev
    Réponses: 6
    Dernier message: 21/06/2005, 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