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 :

Création requete SQL complexe


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Création requete SQL complexe
    Hello,

    Description de la situation :
    --------------------------
    Dans le cadre du développement d'une application gérant les formations suivies dans la société, je souhaiterai créer une requête permettant de sortir la liste des formations qui n'ont pas été suivies par plusieurs utilisateurs sélectionnés. Sachant qu'un utilisateur possède une ou plusieurs fonctions et qu'une formation peut être destiné pour une ou plusieurs fonctions. Toutes les tables étant reliées entre elles, comment sortir cette requete ?

    J'ai réussi à créer une requête mais qui ne me permet de sortir la liste des formations non suivies pour UN utilisateur sélectionné et non pour plusieurs...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT FORMATION.NOM_FORM, USERS.ID_USER,USERS.NOM,USERS.PRENOM FROM FORMATION 
    inner JOIN FORMATION_FONCTION ON FORMATION.ID_FORMATION = FORMATION_FONCTION.ID_FORMATION 
    INNER JOIN USERS
    INNER JOIN USER_FONCTION ON USERS.ID_USER = USER_FONCTION.ID_USER 
    ON USER_FONCTION.ID_FONCTION = FORMATION_FONCTION.ID_FONCTION 
    WHERE 1=1 AND USERS.[ID_USER] IN (384)
    AND NOT EXISTS (SELECT * 
                     FROM FORMATION_USER 
                     WHERE FORMATION_FONCTION.ID_FORMATION = FORMATION_USER.ID_FORMATION 
                     and FORMATION_USER.[ID_USER] IN (384)) --> Celle-ci ne fonctionne pas si je met plusieurs ID d'utilisateur. Si un seul = OK.
    Description des tables :
    ----------------------
    Table Formation : (contient toutes les formations) ID_FORM,NOM_FORM
    Table Users : (contient la liste des users ) ID_USER, NOM_USER
    Table Formation_User : ID_FORM_USER,ID_USER,ID_FORM,DATE
    Table Fonction : (contient la liste des fonctions) ID_FONCTION,NOM_FONCT
    Table User_Fonction : (contient la liste des fonctions des users): ID_USER_FONCT,ID_USER,ID_FONCTION
    Table Formation_Fonction : ID_FORM_FONCT,ID_FORM,ID_FONCTION
    Merci d'avance pour votre aide

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    ta jointure ci-dessous est incompléte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INNER JOIN FORMATION_FONCTION ON FORMATION.ID_FORMATION = FORMATION_FONCTION.ID_FORMATION 
    INNER JOIN USERS
    INNER JOIN USER_FONCTION ON USERS.ID_USER = USER_FONCTION.ID_USER

  3. #3
    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 394
    Points
    18 394
    Par défaut
    Ce n'est pas dans le bon ordre (sur les jointures fortes ça ne change rien) mais ce n'est pas incomplet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INNER JOIN FORMATION_FONCTION
      ON FORMATION.ID_FORMATION = FORMATION_FONCTION.ID_FORMATION 
    INNER JOIN USERS
    INNER JOIN USER_FONCTION
      ON USERS.ID_USER = USER_FONCTION.ID_USER 
      ON USER_FONCTION.ID_FONCTION = FORMATION_FONCTION.ID_FONCTION
    Serait mieux écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INNER JOIN FORMATION_FONCTION
      ON FORMATION.ID_FORMATION = FORMATION_FONCTION.ID_FORMATION 
    INNER JOIN USER_FONCTION 
      ON USER_FONCTION.ID_FONCTION = FORMATION_FONCTION.ID_FONCTION 
    INNER JOIN USERS
      ON USERS.ID_USER = USER_FONCTION.ID_USER
    Mais encore une fois c'est strictement équivalent avec des INNER JOIN.

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Non la jointure ci-dessous fonctionne, je l'avais lu et testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inner JOIN FORMATION_FONCTION ON FORMATION.ID_FORMATION = FORMATION_FONCTION.ID_FORMATION 
    INNER JOIN USERS
    INNER JOIN USER_FONCTION ON USERS.ID_USER = USER_FONCTION.ID_USER 
    ON USER_FONCTION.ID_FONCTION = FORMATION_FONCTION.ID_FONCTION

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    je te propose ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT FORMATION.NOM_FORM,(SELECT user.ID_USER
                                                from USERS user
                                                WHERE USERS.ID_USER=user.ID_USER) as IDUSER 
    FROM FORMATION 
    inner JOIN FORMATION_FONCTION 
    ON FORMATION.ID_FORMATION = FORMATION_FONCTION.ID_FORMATION 
    INNER JOIN USER_FONCTION 
    ON USERS.ID_USER = USER_FONCTION.ID_USER
    LEFT join USERS
    on USERS.ID_USER=USER_FONCTION.ID_USER
    Where ID_USER is NULL          
    and USERS.ID_USER IN (384,....)

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    plutôt ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT FORMATION.NOM_FORM,(SELECT user.ID_USER
                                                FROM USERS user
                                                WHERE USERS.ID_USER=user.ID_USER) AS IDUSER 
    FROM FORMATION 
    INNER JOIN FORMATION_FONCTION 
    ON FORMATION.ID_FORMATION = FORMATION_FONCTION.ID_FORMATION 
    INNER JOIN USER_FONCTION 
    ON USERS.ID_USER = USER_FONCTION.ID_USER
    LEFT JOIN USERS
    ON USERS.ID_USER=USER_FONCTION.ID_USER
    AND USERS.ID_USER IN (384,....)
    Where  ID_USER IS NULL

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Cela ne fonctionne pas (malgré que je remplace les "user" par "usertp" car mot système)

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    Il y avait une erreur dans jointure ou "ID_FONCTION" a été remplacé "ID_USER", il aurait du te la signaler

    essais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT FORMATION.NOM_FORM,(SELECT usesr.ID_USER
                                                FROM USERS users
                                                WHERE USERS.ID_USER=users.ID_USER) AS IDUSER 
    FROM FORMATION 
    INNER JOIN FORMATION_FONCTION 
    ON FORMATION.ID_FORMATION = FORMATION_FONCTION.ID_FORMATION 
    INNER JOIN USER_FONCTION 
    ON USER_FONCTION.ID_FONCTION= FORMATION_FONCTION.ID_FONCTION
    LEFT JOIN USERS
    ON USERS.ID_USER=USER_FONCTION.ID_USER
    AND USERS.ID_USER IN (384,....)
    WHERE  ID_USER IS NULL

Discussions similaires

  1. requete sql complexe
    Par susimido dans le forum Langage SQL
    Réponses: 1
    Dernier message: 23/04/2007, 18h01
  2. requete SQL complexe!
    Par cedlannoy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/03/2007, 21h45
  3. requete sql complexe, que faire: 2 sql imbriques ou fonction date?
    Par Aliveli dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 22/06/2006, 21h20
  4. Requete SQL complexe
    Par isa21493 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/02/2006, 17h43
  5. Requete sql complexe
    Par ekinoxe dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 11/01/2006, 17h16

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