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 :

Requete et foreign key


Sujet :

Langage SQL

  1. #1
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 102
    Points
    3 102
    Par défaut Requete et foreign key
    Bonjour a tous,

    je ne parviens pas a extraire les données d'une de mes tables dans laquelle une foreign key reference la clé primaire de cette même table.

    Autrement dit, ma table t_emp ressemble a ca:
    • emp_id PK
    • emp_nom
    • emp_idqua FK references t_qua on qua_id
    • et la fameuse emp_assist FK references t_emp on emp_id

    je souhaite extraire tous les emp de ma table t_emp avec t_assist qu'il soit null ou rempli.
    Je fais cette requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT TEmp.EMP_NOM,  
                    ISNULL(QUA_LIB{0},QUA_LIB{0}),  
                    ISNULL(TEmp.EMP_ASSIST,TEmp.EMP_ASSIST),  
                    FROM T_EMP TEmp, T_EMP TAssist, T_QUA, 
                    WHERE TEmp.EMP_IDQUA=QUA_ID 
                    AND TEmp.EMP_ASSIST=TAssist.EMP_ID AND TEmp.EMP_ID=@EMP_ID
    or cette requete ne me renvoie des lignes que pour les emp ayant un TEmp.EMP_ASSISTANTE not null
    Et tous les emp qui n'ont pas de t_assist en base ne sont pas extraits par le requete.
    Je commence à m'arracher les cheveux, pourriez vous m'aider svp.

    Merci

  2. #2
    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
    Je crois avoir compris ce que tu essayais de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT  TEmp.EMP_NOM
        ,   ISNULL(QEmp.QUA_LIB{0}, QAssist.QUA_LIB{0})
        ,   ISNULL(TEmp.EMP_ASSIST, TAssist.EMP_ASSIST)
    FROM    T_EMP AS TEmp
        INNER JOIN
            T_QUA as QEmp
            ON  TEmp.EMP_IDQUA = QEmp.QUA_ID 
        LEFT JOIN
            T_EMP AS TAssist
            ON  TEmp.EMP_ASSIST = TAssist.EMP_ID
        LEFT JOIN
            T_QUA as QAssist
            ON  TAssist.EMP_IDQUA = QAssist.QUA_ID 
    WHERE   TEmp.EMP_ID = @EMP_ID
    ;

  3. #3
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 102
    Points
    3 102
    Par défaut
    merci beaucoup al1_24, je n'aurais pas pensé au left join.

    J'ai réfléchi a une autre solution et je pensais faire ma requete avec un UNION de sorte que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT TEmp.EMP_NOM,  
                    ISNULL(QUA_LIB{0},QUA_LIB{0}),  
                    ISNULL(TEmp.EMP_ASSIST,TEmp.EMP_ASSIST),  
                    FROM T_EMP TEmp, T_EMP TAssist, T_QUA, 
                    WHERE TEmp.EMP_IDQUA=QUA_ID 
                    AND TEmp.EMP_ASSIST=TAssist.EMP_ID AND TEmp.EMP_ID=@EMP_ID
    UNION
    SELECT TEmp.EMP_NOM,  
                    ISNULL(QUA_LIB{0},QUA_LIB{0}),  
                    ISNULL(TEmp.EMP_ASSIST,TEmp.EMP_ASSIST),  
                    FROM T_EMP TEmp, T_EMP TAssist, T_QUA, 
                    WHERE TEmp.EMP_IDQUA=QUA_ID 
                    AND TEmp.EMP_ASSIST=IS NULL AND TEmp.EMP_ID=@EMP_ID
    Afin d'extraire les employés ayant une assist et ceux n'en ayant pas.
    La logique me semble bonne, mais mssql server me renvoie une erreur:
    Msg 421, Level 16, State 1, Line 1
    Le type de données text ne peut pas être sélectionné en tant que DISTINCT, car il n'est pas comparable.
    chose que je ne comprend pas puisque je n'ai pas de DISTINCT dans ma requete

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 770
    Points
    23 770
    Par défaut
    Citation Envoyé par calagan99
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT TEmp.EMP_NOM,  
                    ISNULL(QUA_LIB{0},QUA_LIB{0}),  
                    ISNULL(TEmp.EMP_ASSIST,TEmp.EMP_ASSIST),  
                    FROM T_EMP TEmp, T_EMP TAssist, T_QUA, 
                    WHERE TEmp.EMP_IDQUA=QUA_ID 
                    AND TEmp.EMP_ASSIST=TAssist.EMP_ID AND TEmp.EMP_ID=@EMP_ID
    UNION
    SELECT TEmp.EMP_NOM,  
                    ISNULL(QUA_LIB{0},QUA_LIB{0}),  
                    ISNULL(TEmp.EMP_ASSIST,TEmp.EMP_ASSIST),  
                    FROM T_EMP TEmp, T_EMP TAssist, T_QUA, 
                    WHERE TEmp.EMP_IDQUA=QUA_ID 
                    AND TEmp.EMP_ASSIST=IS NULL AND TEmp.EMP_ID=@EMP_ID
    Euh, le "= IS NULL" à la fin, c'est assez bizarre et ça peut expliquer un de tes problèmes.
    Autre remarque, il est préférable d'écrire les jointures avec la clause join, plutôt que dans la clause where. C'est une bonne habitude à prendre et je te renvoie vers l'excellent tutoriel de SQLPro pour comprendre tout ça.

    ced

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

Discussions similaires

  1. [MySQL] Requete sur des tables avec des Foreign Keys.
    Par bruno7619 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/04/2009, 11h58
  2. Réponses: 3
    Dernier message: 13/02/2007, 16h52
  3. [IB71] Je ne peux plus supprimer mes foreign key...
    Par BoeufBrocoli dans le forum InterBase
    Réponses: 3
    Dernier message: 19/09/2003, 14h39
  4. [postgresql][foreign key]
    Par elea1206 dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/08/2003, 12h07
  5. [Foreign Key] Besoin d'explication.
    Par Andry dans le forum Débuter
    Réponses: 4
    Dernier message: 28/05/2003, 11h34

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