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 :

Une requête SQL


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Haïti

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2012
    Messages : 1
    Par défaut Une requête SQL
    slt, j'aimerais savoir comment ecrire cette requte svp!!

    toutes les hôtesses plus expérimentées (cad avec plus d’heures de vol) que sophie

    voici ce que j'ai essaye mais ca ne marche pas!! sil ya quelqu'un qui peut m'aider j'attend!! mERCI

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select nom 
    from Personnel, Equipage, Vol, Destination 
    where (Personnel.PersonnelID=Equipage.PersonnelID and Equipage.volID=Vol.volID and Destination.destinationID=Vol.destinationID and typepersonnel='hotesse' and distance=(select sum(distance) from Destination, Personnel, Equipage, Vol where (Personnel.PersonnelID=Equipage.PersonnelID and Equipage.volID=Vol.volID and Destination.destinationID=Vol.destinationID and nom='sophie')));

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 16 818
    Billets dans le blog
    14
    Par défaut
    1) Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN. Il serait temps de s'y mettre !

    2) Aérez et indentez votre code ! Il sera plus facile à lire et à débugguer. Il donnera davantage envie de vous aider.

    3) Utilisez des alias dès qu'il y a plus d'une table pour les mêmes raisons qu'au point 2 et utilisez systématiquement devant toutes les colonnes invoquées par la requête. Ce sera plus facile de savoir de quelles tables viennent les colonnes et évitera les éventuels problèmes d'ambiguïté de noms identiques.

    4) Inutile de mettre des parenthèses partout, ça alourdit encore la lecture !
    Soyez fainéant ! N'écrivez que ce qui est nécessaire !

    Passons au problème...
    toutes les hôtesses plus expérimentées (cad avec plus d’heures de vol) que sophie
    A) Combien d'heures de vol à Sophie ?
    En fait, d'après votre requête, vous ne comptez pas les heures de vol, vous additionnez les distances des destinations.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT SUM(d.distance) AS somme_distance
    FROM Destination d
    INNER JOIN Vol v ON v.destinationID = d.destinationID
    	INNER JOIN Equipage e ON e.volID = v.volID
    		INNER JOIN Personnel p ON p.PersonnelID = e.PersonnelID
    WHERE p.nom = 'Sophie'
    	AND p.typepersonnel = 'hotesse'
    B) Combien de distance pour chaque hotesse sauf Sophie ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT p.nom, SUM(d.distance) AS somme_distance
    FROM Destination d
    INNER JOIN Vol v ON v.destinationID = d.destinationID
    	INNER JOIN Equipage e ON e.volID = v.volID
    		INNER JOIN Personnel p ON p.PersonnelID = e.PersonnelID
    WHERE p.typepersonnel = 'hotesse'
    	AND p.nom <> 'Sophie'
    GROUP BY p.nom
    C) Quelles sont celles qui ont plus de distance que Sophie ?
    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 p.nom, SUM(d.distance) AS somme_distance
    FROM Destination d
    INNER JOIN Vol v ON v.destinationID = d.destinationID
    	INNER JOIN Equipage e ON e.volID = v.volID
    		INNER JOIN Personnel p ON p.PersonnelID = e.PersonnelID
    WHERE p.typepersonnel = 'hotesse'
    	AND p.nom <> 'Sophie'
    GROUP BY p.nom
    HAVING somme_distance >
    (
    	SELECT SUM(d.distance) AS somme_distance
    	FROM Destination d
    	INNER JOIN Vol v ON v.destinationID = d.destinationID
    		INNER JOIN Equipage e ON e.volID = v.volID
    			INNER JOIN Personnel p ON p.PersonnelID = e.PersonnelID
    	WHERE p.nom = 'Sophie'
    		AND p.typepersonnel = 'hotesse'
    )
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 031
    Billets dans le blog
    6
    Par défaut
    Entre nous ce serait mieux si vous faisiez une requête corrélée :

    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 p.nom, SUM(d.distance) AS somme_distance
    FROM   Destination d
           INNER JOIN Vol v 
                 ON v.destinationID = d.destinationID
           INNER JOIN Equipage e 
    	         ON e.volID = v.volID
           INNER JOIN Personnel p 
    	         ON p.PersonnelID = e.PersonnelID
    WHERE  p.typepersonnel = 'hotesse'
      AND  p.nom <> 'Sophie'
    GROUP  BY p.nom
    HAVING somme_distance > (SELECT SUM(d.distance) AS somme_distance
                             FROM   Destination d2
                                    INNER JOIN Vol v2 
                                          ON v2.destinationID = d2.destinationID
                                    INNER JOIN Equipage e2 
                                          ON e2.volID = v2.volID
                                    INNER JOIN Personnel p2 ON p2.PersonnelID = e2.PersonnelID
                             WHERE  p2.nom = p.nom
                               AND  p2.typepersonnel = p.typepersonnel)
    Cela évite de mettre deux fois les paramètres (au risque de se tromper) et évite des transtypages supplémentaires...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 16 818
    Billets dans le blog
    14
    Par défaut
    J'avais cru comprendre que les requêtes correllées sont des goufres à performances ?
    Ce n'est pas toujours le cas ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 031
    Billets dans le blog
    6
    Par défaut
    Il faut tester.... Dans son cas cela évite déja des erreurs entre les deux versions des paramètres
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Quand je veux éviter la duplication des paramètres, j'ai tendance à utiliser WITH :

    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
     
    WITH params AS
    (
      SELECT 'hotesse' as TypePersonnel
                ,'Sophie' as Nom
          FROM DUAL -- Pour Oracle, virer cette ligne pour SQL Server
    )
    SELECT p.nom, SUM(d.distance) AS somme_distance
    FROM Destination d
    INNER JOIN Vol v ON v.destinationID = d.destinationID
    	INNER JOIN Equipage e ON e.volID = v.volID
    		INNER JOIN Personnel p ON p.PersonnelID = e.PersonnelID
            CROSS JOIN params 
    WHERE p.typepersonnel = params.TypePersonnel
    	AND p.nom <> params.Nom
    GROUP BY p.nom
    HAVING somme_distance >
    (
    	SELECT SUM(d.distance) AS somme_distance
    	FROM Destination d
    	INNER JOIN Vol v ON v.destinationID = d.destinationID
    		INNER JOIN Equipage e ON e.volID = v.volID
    			INNER JOIN Personnel p ON p.PersonnelID = e.PersonnelID
                     CROSS JOIN params
    	WHERE p.nom = params.Nom
    	    AND p.typepersonnel = params.TypePersonnel
    )
    Je n'ai pas noté de changement notable de performance, mais du coup c'est assez agréable à relire : on voit dès le début quels sont les paramètres utilisés, et si on doit changer quelque chose c'est plus pratique (à mon sens).

Discussions similaires

  1. Pb sur une requête SQL (de champ vide)
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2004, 12h12
  2. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 19h38
  3. Récupurer via une requête SQL la valeur la plus proche
    Par yoda_style dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/04/2004, 14h52
  4. Résultat d'une requète SQL
    Par camino dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/02/2004, 16h22
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 17h26

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