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 :

Requête sql avec jointure et table vide (ou tuple nulle)


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 97
    Points : 52
    Points
    52
    Par défaut Requête sql avec jointure et table vide (ou tuple nulle)
    Bonjour,

    J'ai un petit problème pour une requête SQL.
    J'ai 3 tables : Carte, Affectation et Agent.
    Le lien est fait entre Agent et Carte grâce à l'Affectation qui contient 2 clés étrangères IDCarte et IDAgent.

    Je souhaiterais sélectionner tous les agents qui n'ont pas de cartes donc pas d'affectation, c'est à dire que la table Affectation ne contient pas les IDAgents des agents à sélectionner.

    Par exemple, dans un premier temps, aucune carte et donc aucune Affectation n'est créée. Il faut donc que je sélectionne tous les Agents, là c'est plutôt simple. Mais si une affectation est créée, alors je n'arrive pas à sélectionner seulement les agents qui n'ont pas d'affectation (les autres).

    La requête est peut être simple, mais j'ai beau tourner ça dans tous les sens, impossible d'y parvenir.

    Si quelqu'un voit quelle requête il faut que j'utilise, merci de me prévenir !

    Cordialement,

    Aenur56.

  2. #2
    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 : 61
    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
    Il faut faire une jointure externe ou utiliser NOT EXISTS.

    Qu'as-tu essayé comme requête ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 97
    Points : 52
    Points
    52
    Par défaut
    Merci de ta réponse.

    Voici mon dernier essai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 
    	Agent.IDAgent
    FROM 
    	Carte,	
    	Affectation,	
    	Agent
    WHERE 
    		Affectation.IDCarte	=	Carte.IDCarte
    	AND	Affectation.IDAgent	=	Agent.IDAgent
    	AND Affectation.IDAffectation = NULL
    J'ai vu en faisant des recherches que je pouvais utiliser le NOT EXISTS mais je n'y arrive pas, comment s'utilise-t-il ?

    Merci d'avance !

    [EDIT] : J'ai essayé un nouveau code avec NOT EXISTS mais ça ne marche pas non plus il ne me trouve aucun résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 
    	Agent.IDAgent
    FROM 
    	Affectation,	
    	Agent
    WHERE 
    	NOT EXISTS (SELECT Affectation.IDAgent
    				FROM Affectation
    				WHERE Affectation.IDAgent = Agent.IDAgent
    				)
    Voyez-vous ou est le problème ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 97
    Points : 52
    Points
    52
    Par défaut
    Finalement, problème résolu grâce à une jointure externe comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
    	Agent.IDAgent
    FROM 
    	Affectation,	
    	Agent
    WHERE 
    	Agent.IDAgent = Affectation.IDAgent(+)
    Merci beaucoup CinePhil pour ton aide !

  5. #5
    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
    Non ce n'est pas bon non plus.

    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ag.IDAgent
      FROM Agent ag
     WHERE NOT EXISTS (SELECT null
                         FROM Affectation af
                        WHERE af.IDAgent = ag.IDAgent)
    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ag.IDAgent
      FROM Agent ag
           LEFT OUTER JOIN Affectation af
             ON af.IDAgent = ag.IDAgent
     WHERE af.IDAgent is null

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 97
    Points : 52
    Points
    52
    Par défaut
    Exact Waldar je ne l'ai remarqué qu'après ^^
    Je te remercie beaucoup, la première solution marche nikel

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

Discussions similaires

  1. Construction d'une requête SQL avec jointure
    Par Didiou35 dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/10/2009, 22h26
  2. Requête SQL avec jointure
    Par manu32320 dans le forum Zend_Db
    Réponses: 3
    Dernier message: 17/05/2009, 00h19
  3. Requète SQL avec nom de table contenu dans une variable
    Par samoussa dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/05/2009, 13h58
  4. Requête SQL avec jointure sur trois tables
    Par pit2121 dans le forum SQL
    Réponses: 0
    Dernier message: 19/05/2008, 20h24
  5. Requête SQL avec création de table sous condition
    Par misig dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 04/11/2007, 08h58

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