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 sélectionnant une table suivant le résultat d'une autre requête


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Requête sélectionnant une table suivant le résultat d'une autre requête
    Bonjour tout le monde et bonne année,

    Je cherche depuis tout à l'heure une solution pour régler mon problème. J'ai essayé de faire ça avec des sous-requêtes mais ça n'a pas l'air de marcher.

    Je m'adresse donc à vous pour m'éclairer. Voici mon problème :

    J'ai une table1 avec un champ dont la valeur porte le nom d'une autre table, la valeur de ce champ peut-être table2 ou table3. Je veux récupérer le champ "nom", qui est commun aux tables "table2" et "table3". Donc en gros, la requête donnerait ça : SELECT nom FROM (valeur du champ table1). Mais malheureusement ça ne marche pas, j'ai essayé avec les sous requêtes, mais rien n'y fait, ça ne marche toujours pas.

    Merci de votre aide, et si vous voulez que je vous explique plus en détail certaines choses n'hésitez pas à me demander.

  2. #2
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Il faudrait donner des exemples sur les tables en question. Et aussi ton SGBDR (voir les règles d'utilisation du forum).

    Mais j'ai l'impression que ce que tu demandes n'a rien à voir avec du SQL, au pire c'est du SQL dynamique, mais ce n'est pas de la base de données mais plus du bidouillage.

    Le simple fait de parler de "Je veux récupérer le champ "nom", qui est commun aux tables "table2" et "table3"" et de "valeur du champ table1" montre que tu te trompes de direction. Quand tu fais une requête tu dois penser métier et non valeur du champ de la table.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 917
    Points : 51 693
    Points
    51 693
    Billets dans le blog
    6
    Par défaut
    Vous pouvez encapsuler un CASE dans un JOIN. Si vous respectiez la charte de postage nous pourrions vous aider un peu plus !
    A lire :
    http://www.developpez.net/forums/ann....php?f=37&a=69

    A +

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Mon SGBDR est mysql. Il me semble bien que ce soit le bon forum, d'après ce que j'ai vu, mais il se peut que je me trompe.

    Voici un exemple :

    Table employer :

    id - pseudo - bat_attrib - typebats
    1 - tructr -- 1 ---------- entrepot
    2 - trictr --- 2 ---------- usine

    Table usine :

    id - nom
    1 - usine n°1
    2 - usine n°2

    Table entrepot :

    id - nom
    1 - entrepot n°1
    2 - entrepot n°2

    Donc avec une requête je récupère le nom de l'employé, l'id du bâtiment où il est attribué ainsi que le type du bâtiment (usine ou entrepôt).
    Jusque là tout marche correct, mais après, il faut que je sélectionne une des deux autres tables suivant la valeur du champ typebats, et que la valeur du champ bat_attrib correspondent à l'id de l'usine ou de l'entrepôt. J'ai tenté quelque chose avec les sous-requêtes, mais ça n'a pas marché.

    Merci de votre aide et désolé je n'avais pas vu les règles car je les croyais avec les autres sujets "importants".

  5. #5
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    (c'est le bon forum).
    Tu m'as fait peur avec "valeur du champ table1". Je comprends mieux maintenant avec ton exemple.

    2 solutions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT emp.id, emp.pseudo,u.nom,e.nom
    FROM employer emp
    LEFT JOIN usine u ON emp.bat_attrib=u.id and emp.typebats='usine'
    LEFT JOIN entrepot e ON emp.bat_attrib=e.id and emp.typebats='entrepot'
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT emp.id, emp.pseudo,batiment.nom
    FROM employer emp
    LEFT JOIN 
      (select id, nom, 'usine' typebats
       FROM usine
       UNION
      select id, nom, 'entrepot' typebats
       FROM entrepot
    ) batiment 
    ON emp.id=batiment.id and emp.typebats=batiment.typebats
    La sous-requête correspond à ce que devrait être sans doute ta modélisation. Attention la 2é requête n'est acceptée qu'à partir de mysql 4.01, si ma mémoire est bonne, à cause des sous-requêtes.

    Je préfère ma 2é solution car dans ma première solution je crains que l'affichage de u.nom et de e.nom ne te seront pas suffisants car il y a de grande chance que tu ais besoin du résultat dans une même colonne (donc utiliser des fonctions de regroupement comme MAX pour supprimer les NULL dus aux jointures externes).

    PS important:
    La modélisation de ta base est très bizarre, voire pas bien du tout. A première vue j'insèrerais bien une table batiment entre employer et les 2 tables usine et entrepot; et puis un id dans la table employer qui soit commun à 2 tables différentes ça me choque.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Ok merci ça marche nickel !

    Faut dire aussi que mon premier message n'était pas très clair. J'ai essayé direct la deuxième solution, je n'ai pas essayé la première.

    Pour la modélisation de ma base, ne t'inquiète pas, ce n'est pas comme ça du tout, j'ai juste raccourcis certaines choses pour ne pas compliquer. L'id n'est pas vraiment en commun dans les deux tables, en fait les champs bat_attrib et typebats me servent juste à savoir dans quel entrepôt ou usine l'employé est affecté, il pourrait très bien être affecté à l'usine portant l'id 144 sans qu'il existe un entrepôt portant ce même id. J'ai aussi fait une table bâtiment, mais je me suis dit qu'elle ne servirait sans doute à pas grand chose car les deux seuls types seront usine et entrepôt.

    Merci de m'avoir aidé !

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 917
    Points : 51 693
    Points
    51 693
    Billets dans le blog
    6
    Par défaut
    Beaucoup plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT e.id, e.pseudo, COALESCE(u.nom, p.nom) AS BATIMENT
    FROM   employer e
           CROSS JOIN usine u
           CROSS JOIN entrepot p
    WHERE  e.bat_attrib = CASE typebats
                             WHEN 'usine' then u.id
                             WHEN 'entrepot' then p.id
                          END
    A +

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Je me permet de remonter ce sujet car j'ai décidé de suivre les conseils de phili_b en créant une nouvelle table batiment. Je pense que la modélisation de cette table convient mais on peut sans problème la changer au besoin :
    Table batiment :
    id - nom - noms
    1 - usine - usine
    2 - entrepot - entrepôt
    3 - bat_space - bâtiment spécial

    Le champ "nom" contient le nom de la table du bâtiment.

    Je pense que la solution n'est pas évidente du tout donc ne vous cassez pas trop la tête au pire je ferais deux requêtes.

    Merci d'avance !

Discussions similaires

  1. UPDATE d'une table à partir des résultats d'une requête
    Par pascal_06 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 05/12/2013, 15h08
  2. Mise à jour d'une table à partir du résultat d'une requête
    Par zoharcryss dans le forum Langage SQL
    Réponses: 12
    Dernier message: 18/08/2009, 15h33
  3. Remplir une table avec le résultat d'une instruction SQL
    Par jbeu dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/09/2007, 23h49
  4. update d'une table suivant un select d'une autre table
    Par cortex024 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/03/2007, 12h38
  5. Réponses: 8
    Dernier message: 11/08/2006, 09h30

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