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 :

SELECT imbriqués dans 2 tables


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut SELECT imbriqués dans 2 tables
    Bonsoir

    Je débute en SQL, ne tapez pas trop fort SVP
    Je dois faire des modifications dans une base de donnée et je dois faire des SELECT imbriqués (je pense, mais il y a peut être plus simple) pour récupérer des paramètres et je n'y arrive pas
    J'arrive à récupérer le premier paramètre

    Voici un exemple de mes 2 tables :
    La table T1 est un ensemble de tests ou chaque IDFollowUpX est la clé des mesures effectués pour chacun des tests dans la table T2
    Je chercher à récupérer tous les paramètres Par6 pour un IDMesure donné sauf si Par6 est -1 (non mesuré)
    FollowUpStateX permet de savoir si la test est valide.
    Dans le cas du 217, je dois avoir :
    217;1001;91;1004;-1;1005;61

    T1 Table de tests
    IDCase;IDMesure;IDFollowUp1;IDFollowUp2;IDFollowUp3;IDFollowUp4;IDFollowUp5;IDFollowUp6;FollowUpState1;FollowUpState2;FollowUpState3;FollowUpState4;FollowUpState5;FollowUpState6
    1;200;1000;1002;1006;1007;1008;-1;0;0;0;0;0;-1
    2;217;1001;1004;1005;-1;-1;-1;0;0;0;-1;-1;-1
    3;127;1003;1009;1010;1011;1012;1013;0;0;0;0;0;0

    T2 Table de suivi
    ID;IDAuthor;FollowUpDate;Par1;Par2;Par3;Par4;Par5;Par6
    1000;28;01/01/2016;73;0;55;63;44;43
    1001;28;01/01/2016;18;6;35;96;46;91
    1002;28;02/01/2016;7;19;14;90;43;35
    1003;28;03/01/2016;12;32;81;41;11;72
    1004;28;03/01/2016;22;9;60;94;27;Null
    1005;45;04/01/2016;94;33;83;38;7;61
    1006;45;04/01/2016;31;30;4;55;81;50
    1007;45;05/01/2016;40;30;77;72;71;1
    1008;57;10/01/2016;80;82;77;14;4;32
    1009;12;15/01/2016;82;50;99;Null;Null;Null
    1010;12;16/01/2016;55;8;50;41;Null;Null
    1011;12;17/01/2016;67;55;1;82;Null;Null
    1012;12;18/01/2016;79;18;Null;Null;Null;Null
    1013;28;05/02/2016;43;54;13;0;85;73
    1014;57;08/02/2016;55;28;14;96;80;10
    1015;45;15/02/2016;23;70;87;13;67;47
    1016;12;01/03/2016;95;49;15;84;Null;Null

    Comment faire pour récupérer les autres Par6 en imbriquant 5 fois la requete suivante?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT c.caseID as caseID, 
    			c.IDFollowUp1 as f1_id, f.Par6 as f1_Par6, 
    			c.IDFollowUp2 as f2_id,
    			c.IDFollowUp3 as f3_id,
    			c.IDFollowUp4 as f4_id,  
    			c.IDFollowUp5 as f5_id,  
    			c.IDFollowUp6 as f6_id  
    		        FROM 
    			Table1 as c,  
    			Table2 as f 
    			WHERE c.IDFollowUp1 = f.ID AND FollowUpState2 != -1 AND c.caseID = 217

  2. #2
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Je me suis dit que je prenais le truc à l'envers du coup je pense avoir trouvé la solution :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT f.id, f.followupdate, f.par6, c.caseID
    FROM Table2 as f, Table1 as c
    WHERE c.caseID = 217 AND 
    (f.id = c.IDFollowUp1 OR f.id = c.IDFollowUp2 OR f.id = c.IDFollowUp3 OR f.id = c.IDFollowUp4 OR 
    f.id = c.IDFollowUp5 OR f.id = c.IDFollowUp6)

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vous pourriez utiliser un IN à la place de votre série de tests d'égalité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    f.id IN (c.IDFollowUp1 , c.IDFollowUp2 , c.IDFollowUp3 , c.IDFollowUp4 , c.IDFollowUp5 , c.IDFollowUp6)
    Mais cela montre clairement un problème de modélisation. Vous ne devriez pas avoir ces données dans 6 colonnes, mais dans 6 lignes, avec une colonne indiquant leur rang (1,2,3,4,5 ou 6)

  4. #4
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Il me parait clair que ce n'est pas optimisé mais je ne vais pas tout refaire alors que je ne dois que faire quelques modifications!
    Par contre dans ce cas précis pour ma culture personnelle, vous voulez dire que la validité des mesures devrait être dans une autre table T3 ou carrément une table T1 comme la suivante:

    T1 Table de tests
    ID;IDMesure;IDFollowupCol;IDFollowUp;IDFollowUpState
    100;217;1;1001;0
    101;217;2;1004;0
    102;217;3;1005;0
    103;217;4;-1;-1
    104;217;5;-1;-1
    105;217;6;-1;-1

    ou bien plus simplement
    T1 Table de tests
    ID;IDMesure;IDFollowupCol;IDFollowUp
    100;217;1;1001
    101;217;2;1004
    102;217;3;1005

    Merci pour le IN que je ne connaissais pas.

  5. #5
    Membre confirmé Avatar de Sebwar
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 172
    Points : 498
    Points
    498
    Par défaut
    Hello !

    Il voulait juste dire qu'a la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT f.id, f.followupdate, f.par6, c.caseID
    FROM Table2 as f, Table1 as c
    WHERE c.caseID = 217 AND 
    (f.id = c.IDFollowUp1 OR f.id = c.IDFollowUp2 OR f.id = c.IDFollowUp3 OR f.id = c.IDFollowUp4 OR 
    f.id = c.IDFollowUp5 OR f.id = c.IDFollowUp6)
    vous pouvez mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT f.id, f.followupdate, f.par6, c.caseID
    FROM Table2 as f, Table1 as c
    WHERE c.caseID = 217 AND 
    f.id IN (c.IDFollowUp1 , c.IDFollowUp2 , c.IDFollowUp3 , c.IDFollowUp4 , c.IDFollowUp5 , c.IDFollowUp6)

  6. #6
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci j'avais compris , je répondais à cette phrase.

    Citation Envoyé par aieeeuuuuu Voir le message
    Mais cela montre clairement un problème de modélisation. Vous ne devriez pas avoir ces données dans 6 colonnes, mais dans 6 lignes, avec une colonne indiquant leur rang (1,2,3,4,5 ou 6)

  7. #7
    Membre régulier
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Mars 2016
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Mars 2016
    Messages : 58
    Points : 105
    Points
    105
    Par défaut
    Bonjour

    Comme le precisait aieeeuuuuu, le gros probleme de votre modele actuel est que si demain vous souhaitez ajouter une 7eme test vous allez etre coince. La seule solution sera de creer une nouvelle colonne.

    Cela signifie que vous allez devoir modifier la structure de la base, certainement les requetes existantes pour tenir compte de ce 7eme test ...

    De plus la base va contenir des colonnes non renseignees (historique pour le 7eme test) ce qui n'arrange rien pour la taille de la base et les perfs

    Avec une structure du type

    ID
    IDMESURE
    IDFOLLOWUPCOL
    IDFOLLOWUP

    plus de soucis vous pouvez rajouter autant de test que vous voulez il ne sera pas necessaire de modifier la structure

Discussions similaires

  1. select "arborescent" dans une table
    Par Elianora la blanche dans le forum Requêtes
    Réponses: 3
    Dernier message: 18/02/2009, 18h53
  2. Problème de select multiples dans plusieurs tables
    Par superseb801 dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/05/2007, 02h22
  3. selection aleatoire dans une table
    Par scorpion.os dans le forum Langage SQL
    Réponses: 7
    Dernier message: 04/05/2007, 11h54
  4. Selection enregistrement dans une table
    Par Renardo dans le forum Access
    Réponses: 3
    Dernier message: 22/07/2006, 12h22

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