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 :

Recherche d'enregistrements "non présents"


Sujet :

Langage SQL

  1. #1
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut Recherche d'enregistrements "non présents"
    Bonjour,

    Je bloque complet sur la création de l'une de mes requêtes !!!

    Un exemple vaut mieux qu'un long discours :

    Table EMPLOYÉ(idEmployé INT PRIMARY KEY NOT NULL, nom VARCHAR(100), prenom VARCHAR(100))
    Table VOITURE(idVoiture INT PRIMARY KEY NOT NULL, nom VARCHAR(100))
    Table LOCATION(idLocation INT PRIMARY KEY NOT NULL, idEmployé INT, idVoiture INT, dDebut DATE, dFin DATE)


    J'ai donc :
    - une table avec la liste des employés,
    - une table avec la liste des voitures de la société,
    - une table de liaison qui m'indique l'utilisation des voitures par mes salariés (un salarié a utilisé telle voiture de telle date à telle date).

    Maintenant j'aimerais faire une requête qui me retourne la liste des employés qui n'ont pas de voiture louée en ce moment.

    Je ne vois pas du tout comment construire la requete.

    Est-ce que quelqu'un a une piste ?

    Merci d'avance.
    Google est ton ami !

  2. #2
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Un exemple avec EXISTS (il y a plusieurs façon d'écrire une même requête en SQL):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select * 
    from employé
    where not exists (
    	select *
    	from location
    	where location.idEmployé = employé.idEmployé
    	  and CURRENT_DATE() BETWEEN dDebut and dFin
    );

  3. #3
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Avec EXCEPT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select *
    from employé
    EXCEPT
    select employé.*
    from employé
    	join location
    		on location.idEmployé = employé.idEmployé
    where CURRENT_DATE() BETWEEN dDebut and dFin

  4. #4
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    Bonjour et merci pour tes réponses.

    Je suis vraiment navré de ne pas avoir précisé dans mon premier message que la date de fin de location n'est renseignée qu'un fois la location terminée (mes employés utilise une voiture sans connaitre exactement la date à laquelle ils vont devoir changer de voiture).
    Ma base de données comporte donc des enregistrements semblables à ça : IdEmploye = 1, IdVoiture = 1, Début= 01/01/2016, Fin=''


    J'imaginais plus une requête du style :

    Liste des employés qui :
    (
    - ont une date de début de location
    - n'ont pas de date de fin de location
    )
    OU
    (
    - n'ont pas de date de début de location (ils n'ont jamais loué de voiture)
    )
    Google est ton ami !

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    @Oishiiii : tout à fait, à la réserve près du select * à éviter
    - dans le select principal car dangereux en cas d'évolution du DDL et parce qu'il transporte très probablement des colonnes inutiles
    - dans le subselect, bien que dans ce cas particulier aucune colonne ne soit transportée, parce que ça permet de s'habituer à ne pas l'utiliser, et un "select 1" ou "select null" par exemple est plus parlant (on montre qu'on ne cherche pas des données mais bien un booléen)

    @Leoncosnyd : il vous suffit d'adapter le where à partir des solutions proposées par Oishiiii pour tenir compte de vos 2 possibilités de dates
    Par contre, ceux qui n'ont jamais loué ne doivent pas exister dans la table location

  6. #6
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Je sais tout cela merci @escartefigue
    Mais il y a matière à débattre, je reste volontairement sur * dans exists().

  7. #7
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select idEmploye, nom, prenom
    from EMPLOYE
    where not exists (
    	select Null
    	from LOCATION
    	where EMPLOYE.idEmploye = LOCATION.idEmploye
    	and dDebut <> '' and dFin = '');
    Pouvez-vous me confirmer que cette requête fait ce que je souhaite ?

    Lister tous les employés qui ne sont pas dans cette liste : (liste de tous les employés qui ont un début de location mais pas de fin)

    Du coup la requete me ressort la liste des employés qui n'ont jamais eu de location ainsi que ceux qui n'ont pas de location actuellement (même s'ils en ont eu avant et qui sont terminées)
    Google est ton ami !

  8. #8
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    La requête est correcte.
    Si une location a toujours une date de début, ceci est inutile :
    Citation Envoyé par LeonCosnyd Voir le message
    Du coup la requete me ressort la liste des employés qui n'ont jamais eu de location ainsi que ceux qui n'ont pas de location actuellement (même s'ils en ont eu avant et qui sont terminées)
    C'est ce que vous avez demandé dans votre premier message.
    Une personne qui n'a jamais loué, forcément, n'a pas de location actuellement. Elle ressort donc en résultat.

  9. #9
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    Merci beaucoup pour votre réactivité !

    Cela correspond parfaitement à ce que je souhaitais. Je passe en résolu.
    Google est ton ami !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/01/2007, 20h36
  2. enregistrement non présent
    Par robert_trudel dans le forum Access
    Réponses: 6
    Dernier message: 07/12/2006, 02h16
  3. probleme de recherche d'enregistrement (parametre non trouvé)
    Par youcef_b_dz dans le forum Bases de données
    Réponses: 7
    Dernier message: 24/08/2006, 13h04

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