Partage
  • Partager sur Facebook
  • Partager sur Twitter

Les réquetes imbriquées (sous requetes)

    23 novembre 2010 à 19:06:18

    Bonsoir,

    Je n'arrive pas saisir pourquoi utiliser des requetes imbriquées

    Exemple:
    Determiner le numero de l'avion le plus ancien de la compagnie Aéro


    J'ai fait comme ceci :

    SELECT MIN(dateMiseServiceAvion), nomComp 
    FROM avion, compagnie
    WHERE avion.numCompAvion=compagnie.numComp 
    AND nomComp="Aéro";
    


    On m'a dit que c'était faux parce que le seul moyen était d'utiliser une requete imbriqué .... :-°
    Comment la realiser et je voulais savoir si la requete que j'ai écrit plus haut était Fausse ?

    Merci !! :)
    • Partager sur Facebook
    • Partager sur Twitter
      23 novembre 2010 à 19:24:33

      Ça fonctionne parce que c'est sous MySQL. On ne peut pas, théoriquement, sélectionner une colonne ET le résultat d'une fonction d'agrégat. En effet, ça n'a pas de sens : on sélectionne le "dateMiseServiceAvion" le plus bas, mais quel nomComp doit-on choisir ? La réponse : le premier rencontré.

      Or, il se trouve qu'avec ton WHERE, tu filtres nomComp et ne sélectionnes que ceux où le nom est égal à Aéro. Donc le seul nomComp qu'on peut sélectionner, c'est Aéro puisque la condition vire tous les autres.

      Donc, dans ton cas, ça fonctionne. Mais si tu utilisais un autre SGBDR, ce sera différent. La bonne requête, en utilisant la syntaxe normalisée des jointures, serait celle-ci :
      SELECT C.nomComp,
                 MIN(A.dateMiseServiceAvion) AS minDateMiseServiceAvion
            FROM avion A
      INNER JOIN compagnie C
              ON A.numCompAvion = C.numComp
           WHERE C.nomComp = 'Aéro'
        GROUP BY C.nomComp;
      


      Il n'y a pas nécessairement besoin d'une sous-requête, ce serait possible, mais ça complexifie inutilement la requête.
      • Partager sur Facebook
      • Partager sur Twitter
        23 novembre 2010 à 21:19:49

        Y a plus simple puisque t'en veux qu'un.

        SELECT dateMiseServiceAvion, nomComp 
        FROM avion, compagnie
        WHERE avion.numCompAvion=compagnie.numComp 
        AND nomComp="Aéro"
        ORDER BY dateMiseServiceAvion LIMIT 1
        
        • Partager sur Facebook
        • Partager sur Twitter
          23 novembre 2010 à 22:14:00

          Je viens de tester avec ma requete ca marche convenablement je ne vois pas pourquoi mettre en place des requete imbriqué voila mon prof m'a fait ceci :


          SELECT dateMiseServiceAvion, nomComp 
          FROM avion, compagnie
          WHERE avion.numCompAvion=compagnie.numComp 
          AND nomComp="Aéro"
          AND(select MIN(dateMiseServiceAvion) 
          FROM avion, compagnie
          WHERE avion.numCompAvion=compagnie.numComp)
          


          Voila quelque chose comme ceci ...

          Citation : LOrd

          Y a plus simple puisque t'en veux qu'un.

          SELECT dateMiseServiceAvion, nomComp 
          FROM avion, compagnie
          WHERE avion.numCompAvion=compagnie.numComp 
          AND nomComp="Aéro"
          ORDER BY dateMiseServiceAvion LIMIT 1
          




          J'ai peur de dire des sotises, mais je recherche la plus petite date et non un limit 1 :)
          • Partager sur Facebook
          • Partager sur Twitter
            23 novembre 2010 à 22:57:49

            En fait tu n'as pas compris la subtilité de la requêtes de Lord Casque Noir, il trie d'abord les valeurs récupérés par ordre croissant (ordre par défaut). A ce moment la, la date minimum se trouve en premier, et voila l'intérêt du limit 1 qui permet de récupérer uniquement la premier valeur qui est donc celle avec la date la plus petite.

            Pour la requête donnée par ton prof, tu as du te tromper en recopiant je pense car cela ne fonctionnera pas
            • Partager sur Facebook
            • Partager sur Twitter
              23 novembre 2010 à 23:03:17

              Tout à fait.

              Ma requête répond à la question de l'énoncé, qui est mal posée :

              > Determiner le numero de l'avion le plus ancien de la compagnie Aéro

              Elle retourne en fait un des avions les plus anciens, si il y en a plusieurs qui ont le même âge.

              La bonne question est :

              > Determiner le(s) numero(s) du ou des avions de la compagnie Aéro ayant la date de mise en service la plus ancienne

              Autrement dit si les 2 plus vieux avions ont été mis en service en même temps, la requête doit retourner 2 lignes.

              La bonne réponse à la bonne question est celle avec la jointure.
              • Partager sur Facebook
              • Partager sur Twitter
                24 novembre 2010 à 21:57:24

                Salut Julia,,

                Tu recherches un numéro d'avion et tu affiches nomComp (qui est le nom de la compagnie je suppose), j'ai du mal à comprendre ! ;)

                Pour ta requête, ce n'est pas possible qu'elle fonctionne, même sous mysql (cela doit te renvoyer une erreur #1140).
                Comme le sous-entend Fayden, il manque un group by et dans ce cas cela ne répondrait pas à ta demande.

                Pourrais-tu nous donner le contenu des tables (sous forme de modèle logique ou de schéma relationnel) ?

                La piste de la requête imbriquée est en tout cas plutôt bonne.

                La question ne serait pas plutôt : "Quelle est la compagnie qui a le plus vieil avion ? :-°

                Bon courage ! :)
                • Partager sur Facebook
                • Partager sur Twitter

                Les réquetes imbriquées (sous requetes)

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown