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 :

Saurez-vous construire une requête évoluée ?


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut Saurez-vous construire une requête évoluée ?
    Bonjour,

    on considère le schema suivant :

    VOILIER (Numerovoilier, TypeVoilier, PrixLocation, EtatVoilier, #Base)
    CLIENT (NumeroClient NomClient, AdresseClient)
    RESERVATION (NuméroVoilier, NumeroClient, PremierJourLocation, JourRetour)
    SUCCURSALE (Base, Directeur)

    Comment exprimer les 2 requetes suivantes ?

    - quelles sont les bases qui ne louent que des voiliers dont l'état est < 2 ?
    - quels sont les directeurs de base ayant loué, comme clients, un voilier dans une autre base que celle qu'ils dirigent ?

    Le mieux serait en algèbre relationnel, mais comme c'est surement difficile à transcrire ici, l'idée de base suffira.

    Je vois bien des pistes avec des SUMs et des comparaisons, mais peut-être je rate quelque chose ?!

    ++sputnick;

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    lisez ceci : http://sqlpro.developpez.com/cours/sqlaz/sousrequetes/

    En particulier le chapitre sur le prédicat EXISTS (et not exists pour votre 1ere requête)

  3. #3
    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 400
    Points
    28 400
    Par défaut
    Présente-nous tes requêtes... Nous pourrons alors t'aider à les corriger.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Je dirais pour la première question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Base FROM SUCCURSALE WHERE EXISTS (SELECT EtatVoilier FROM VOILIER WHERE EtatVoilier < 2);
    Mais ça me sort toutes les bases au lieu de juste celles avec un EtatVoilier < 2

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Ok, j'ai trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Base FROM VOILIER WHERE EXISTS (SELECT Base FROM SUCCURSALE) AND EtatVoilier < 2;

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    bonjour

    mais peut etre une jonction serait-elle plus appropriee ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Base
      FROM Succursale
        INNER JOIN Voilier ON (Voilier.Base = Succursale.Base AND Voilier.Etatvoilier < 2)
    et pour
    - quels sont les directeurs de base ayant loué, comme clients, un voilier dans une autre base que celle qu'ils dirigent ?
    une petite requete avec EXISTS

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    et pour la seconde,

    je verais bien un truc comme cela (mais sans certitude )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
          SELECT Directeur
                FROM Succursale AS S
                  INNER JOIN Voilier ON (Voilier.Base = S.Base)
                  INNER JOIN Reservation ON (Reservation.Numerovoilier = Voilier.Numerovoilier)
                  INNER JOIN Client C ON (C.Numeroclient = Reservation.Numeroclient)
              WHERE EXISTS(SELECT 1
                             FROM Succursale
                               INNER JOIN Voilier ON (Voilier.Base = Succursale.Base)
                               INNER JOIN Reservation ON (Reservation.Numerovoilier = Voilier.Numerovoilier)
                               INNER JOIN Client ON (Client.Numeroclient = Reservation.Numeroclient AND Client.Numeroclient = C.Numeroclient)
                           WHERE Succursale.Base <> S.Base)

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    et pour la seconde,

    je verais bien un truc comme cela (mais sans certitude )
    Cela ne passe pas sous Oracle 11.1.0.6.0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                FROM Succursale AS S
                                *
    ERROR at line 2:
    ORA-00933: SQL command not properly ended

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    et en elevant le "AS"

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                  INNER JOIN Reservation ON (Reservation.Numerovoilier = Voilier.Numerovoilier)
                                             *
    ERROR at line 4:
    ORA-00904: "RESERVATION"."NUMEROVOILIER": invalid identifier

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Citation Envoyé par sputnick Voir le message
    Ok, j'ai trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Base FROM VOILIER WHERE EXISTS (SELECT Base FROM SUCCURSALE) AND EtatVoilier < 2;
    cette requete est fausse par rapport au besoin.
    Vous devez vérifiez qu'une base n'a pas de voilier avec un état supérieur ou égale à 2 tout en ayant des voilier avec un état inférieur a 2.

    Vous aurez donc besoin de 2 sous-requete en utilisant EXISTS et NOT EXISTS

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Youhou, pour la première j'ai trouvé un truc simple et propre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT SUCCURSALE.Base
    FROM SUCCURSALE, VOILIER
    WHERE VOILIER.Base = SUCCURSALE.Base
    AND VOILIER.ETATVOILIER < 2;

  13. #13
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Encore faux.
    Faites vous un jeu de test !

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par punkoff Voir le message
    cette requete est fausse par rapport au besoin.
    Vous devez vérifiez qu'une base n'a pas de voilier avec un état supérieur ou égale à 2 tout en ayant des voilier avec un état inférieur a 2.

    Vous aurez donc besoin de 2 sous-requete en utilisant EXISTS et NOT EXISTS
    Oui, merci je m'en suis rendu compte, ce pourquoi on trouves une proposition plus heureuse au dessus.

  15. #15
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    re bonjour

    INNER JOIN Reservation ON (Reservation.Numerovoilier = Voilier.Numerovoilier)
    *
    ERROR at line 4:
    ORA-00904: "RESERVATION"."NUMEROVOILIER": invalid identifier
    STP, en regardant juste un peu ce que j'avais ecrit, on trouve la faute en 30sec

    punkoff a ecrit :

    Vous devez vérifiez qu'une base n'a pas de voilier avec un état supérieur ou égale à 2 tout en ayant des voilier avec un état inférieur a 2.
    oups oui
    - quelles sont les bases qui ne louent que des voiliers dont l'état est < 2 ?
    le fondamental est lien est bien le QUE

  16. #16
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Pour écrire une requête qui semble complexe, il faut décomposer le problème.

    VOILIER (Numerovoilier, TypeVoilier, PrixLocation, EtatVoilier, #Base)
    CLIENT (NumeroClient NomClient, AdresseClient)
    RESERVATION (NuméroVoilier, NumeroClient, PremierJourLocation, JourRetour)
    SUCCURSALE (Base, Directeur)
    - quelles sont les bases qui ne louent que des voiliers dont l'état est < 2 ?
    Les bases qui louent des voiliers dont l'état est inférieur à 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT v.Base
    FROM VOILIER v
    WHERE v.EtatVoilier < 2
    Parmi celles-ci, les bases qui ne louent pas de voiliers dont l'état est >= 2 (ou plus simplement > 1) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DISTINCT v.Base
    FROM VOILIER v
    WHERE v.EtatVoilier < 2
        AND NOT EXISTS 
        (
            SELECT *
            FROM VOILIER v2
            WHERE v2.Base = v.Base
                AND v2.EtatVoilier > 1
        )
    Traduction de la requête :
    Sélectionner les bases de la table VOILIER où il y a des voiliers dont l'état est inférieur à 2 et pour lesquelles il n'existe pas de voiliers de la même base dont l'état est supérieur à 1.

    quels sont les directeurs de base ayant loué, comme clients, un voilier dans une autre base que celle qu'ils dirigent ?
    Quelques jointures et le tour est joué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT s.Directeur
    FROM SUCCURSALE s 
    INNER JOIN CLIENT c ON c.NomClient = s.Directeur
        INNER JOIN RESERVATION r ON r.NumeroClient = c.NumeroClient
            INNER JOIN VOILIER v ON v.NumeroVoilier = r.NumeroVoilier
    WHERE s.Base <> v.Base

  17. #17
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Sélectionner les bases de la table VOILIER où il y a des voiliers dont l'état est inférieur à 2 et pour lesquelles il n'existe pas de voiliers de la même base dont l'état est supérieur à 1.
    Ou alors une autre traduction : "sélectionner les bases de la table voilier dont le plus grand état est strictement inférieur à deux."
    Requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      select v.Base
        from Voilier v
    group by v.Base
      having max(v.EtatVoilier) < 2;

  18. #18
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Bravo Waldar ! Tu as trouvé la meilleure requête je pense !

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup, on voit les gars qui jouent avec de la requete de façon quotidienne, c'est beau à voir !

    Voici ce que j'ai pondu en Latex et algèbre relationnel pour la question quelles sont les bases qui ne louent que des voiliers dont l'état est < 2 ?

    <AUTO_CENSURE>faux</AUTO_CENSURE>

    Et pour la question Quels sont les directeurs de base ayant loué, comme clients, un voilier dans une autre base que celle qu'ils dirigent :



    Edit et PS : Spécial BIG UP à CinePhil pour avoir expliqué en détail sa démarche, au final c'est presque plus intéressant que la concision de Waldar

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

Discussions similaires

  1. [MySQL] Construire une requête à partir de listes
    Par tagasuk dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/05/2007, 18h34
  2. Aide pour construire une requête SQL
    Par squalito dans le forum Oracle
    Réponses: 1
    Dernier message: 09/03/2007, 15h04
  3. Aide pour construire une requête SQL
    Par squalito dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/03/2007, 14h08
  4. [SQL] aide pour construire une requête
    Par mealtone dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/08/2006, 15h16
  5. Difficulté à construire une requête
    Par coolcpu dans le forum Langage SQL
    Réponses: 6
    Dernier message: 08/10/2003, 00h43

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