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 :

Utiliser une table comme nom de colonne pour lecture d'une autre table


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Décembre 2019
    Messages : 6
    Par défaut Utiliser une table comme nom de colonne pour lecture d'une autre table
    Bonjour,

    J'ai une base avec 2 types de tables :
    - table1 : qui contient les différents évènements possibles
    - table2 : qui contient les valeurs pour chaque intervention

    Je voudrais faire une requête pour utiliser la table1 comme nom de colonne et les valeurs contenues dans table2

    exemple :
    table1
    id nom description commentaire
    1 transfusion_ref numéro de référence de la transfusion correspond au numéro de lot
    2 transfusion_volume volume en ml -
    3 transfusion_commentaire commentaire associé -
    4 transfusion_prescipteur personne ayant réalisé la prescription -
    5 transfuion_executant personnel réalisant l'acte transfusionnel -

    table2 :
    id patient eventNum eventType valeur user
    1 1 1 1 00000 user
    2 1 1 2 260 user
    3 1 1 3 AUCUN user
    3 1 1 4 DrX user
    4 1 1 5 IDE1 user
    5 2 2 1 00010 user
    6 2 2 2 280 user
    7 2 2 3 en urgence user
    8 2 2 4 DrX user
    9 2 2 5 IDE2 user

    L'objectif est de faire une synthèse qui donnerait un tableau propre avec les noms de colonnes a partir de la table1 et les valeurs contenues dans la table2, avec un résultat de la manière suivante :
    eventNum Patient transfusion_ref transfusion_volume transfusion_commentaire transfusion_prescipteur transfuion_executant
    1 1 00000 260 AUCUN DrX IDE1
    2 2 00010 280 en urgence DrX IDE2

    Je n'arrive pas à trouver une fonction permettant de fusionner cela ... Est-ce que quelqu'un a une idée ??

    Merci de votre réponse.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Vous êtes en train de faire la chose la plus horrible qui soit dans une base de données relationnelles : implémenter une table de type paire clé valeur.
    Pour faire cela il vous faudrait travailler avec un SGBD noSQL comme REDIS ou bien utiliser une table In Memory de SQL Server.

    Dans tous les cas, dans une table traditionnelle,il faudra autant de jointures que de colonnes, ce qui mettra à genou le serveur en plus de provoquer de la contention et des verrous mortels.

    Révisez la modélisation de cette BD et revenez nous voir !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 218
    Billets dans le blog
    16
    Par défaut
    Bonsoir pilipipich,

    Indépendamment des problèmes de performance, solubles ici au moyen d’un index sur la colonne valeur de la table T2, la méthode bourrin ci-dessous vous convient-elle ? A défaut, passer par un PIVOT.

    Création des tables à l’image des vôtres :

    CREATE TABLE T1
    (
             eventType          INT           NOT NULL
           , eventTypeNom       VARCHAR(32)   NOT NULL
           , eventTypeDescr     VARCHAR(64)   NOT NULL
           , eventTypeComment   VARCHAR(64)   NOT NULL 
         , CONSTRAINT T1_PK PRIMARY KEY (eventType)
    )
    ;
    INSERT INTO T1 
    VALUES  
             (1, 'transfusion_ref', 'No ref transfusion', 'cf. no lot')
          ,  (2, 'transfusion_volume', 'volume en ml', '')
          ,  (3, 'transfusion_commentaire', 'commentaire associé', '')
          ,  (4, 'transfusion_prescripteur', 'qui a prescrit', '')
          ,  (5, 'transfusion_executant', 'qui a effectué', '')
     ;
    
    SELECT * FROM T1 ; 
    =>

    eventType   eventTypeNom                 eventTypeDescr          eventTypeComment
    ---------   ----------------------       -------------------     ----------------
    1           transfusion_ref              No ref transfusion      cf. no lot
    2           transfusion_volume           volume en ml     
    3           transfusion_commentaire      commentaire associé    
    4           transfusion_prescripteur     qui a prescrit    
    5           transfusion_executant        qui a effectué  
    
    La table T2

    CREATE TABLE T2
    (
             id             INT           NOT NULL
           , patient        INT           NOT NULL
           , eventNum       INT           NOT NULL
           , eventType      INT           NOT NULL 
           , valeur         VARCHAR(32)   NOT NULL 
         , CONSTRAINT T2_PK PRIMARY KEY (id, eventType)
    ) ;
    
    INSERT INTO T2 VALUES (1, 1, 1, 1, '00000') ;
    INSERT INTO T2 VALUES (2, 1, 1, 2, '260') ;
    INSERT INTO T2 VALUES (3, 1, 1, 3, 'aucun') ;
    INSERT INTO T2 VALUES (3, 1, 1, 4, 'Dr X') ;
    INSERT INTO T2 VALUES (4, 1, 1, 5, 'IDE1') ;
     
    INSERT INTO T2 VALUES (5, 2, 2, 1, '00010') ;
    INSERT INTO T2 VALUES (6, 2, 2, 2, '280') ;
    INSERT INTO T2 VALUES (7, 2, 2, 3, 'en urgence') ;
    INSERT INTO T2 VALUES (8, 2, 2, 4, 'Dr X') ;
    INSERT INTO T2 VALUES (9, 2, 2, 5, 'IDE2') ;
    
    SELECT * FROM T2 ;
    
    =>

    id    patient    eventNum    eventType    valeur
    ----  -------    --------     ---------   -----------
    1     1          1            1           00000
    2     1          1            2           260
    3     1          1            3           aucun
    3     1          1            4           Dr X
    4     1          1            5           IDE1
    5     2          2            1           00010
    6     2          2            2           280
    7     2          2            3           en urgence
    8     2          2            4           Dr X
    9     2          2            5           IDE2
    
    La requête ci-dessous fournit le résultat. Problème : Le nom des colonnes dans le résultat est « en dur ».

    SELECT x.eventNum, x.patient
         , x.valeur as transfusion_ref 
         , y.valeur as transfusion_volume
         , z.valeur as transfusion_commentaire
         , t.valeur as transfusion_prescripteur
         , u.valeur as transfusion_executant
    FROM   (SELECT eventNum, patient, valeur 
           FROM   T2
           WHERE  eventType = 1) as x 
      JOIN (SELECT eventNum, valeur 
           FROM   T2
           WHERE  eventType = 2) as y on x.eventNum = y.eventNum 
      JOIN (SELECT eventNum, valeur 
           FROM   T2
           WHERE  eventType = 3) as z on x.eventNum = z.eventNum 
      JOIN (SELECT eventNum, valeur 
           FROM   T2
           WHERE  eventType = 4) as t on x.eventNum = t.eventNum 
      JOIN (SELECT eventNum, valeur 
           FROM   T2
           WHERE  eventType = 5) as u on x.eventNum = u.eventNum 
    ;
    =>

    eventNum  patient  transfusion_ref  transfusion_volume  transfusion_commentaire   transfusion_prescripteur  transfusion_executant
    1         1        00000            260                 aucun                     Dr X                      IDE1
    2         2        00010            280                 en urgence                Dr X                      IDE2
    
    Désolé de ne pas fournir une solution un peu plus magique...

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Décembre 2019
    Messages : 6
    Par défaut
    Bonjour a vous deux et merci pour vos réponses.

    Citation Envoyé par SQLpro Voir le message
    Vous êtes en train de faire la chose la plus horrible qui soit dans une base de données relationnelles : implémenter une table de type paire clé valeur.
    J'ai bien l'impression que ce n'est pas du tout une utilisation classique (vu l'absence de solution simple). Malheureusement, je suis tributaire de cette BDD qui est déjà en place sur un logiciel donc je ne maitrise pas l'architecture.
    L'objectif est de faire des exports ponctuels pour des questions sur des sujets précis, j'espère que cela ne surcharge pas trop la base.

    Citation Envoyé par fsmrel Voir le message
    La requête ci-dessous fournit le résultat. Problème : Le nom des colonnes dans le résultat est « en dur ».
    Merci pour cette solution. Malheureusement, je commence a me dire qu'il n'y a peut-être pas de solution smart et qu'il faut passer par une technique un peu brut comme cela. Bien entendu, le fait que les noms soient en dur est une sacré limite pour exporter le modèle vers d'autres recherches ... Je vais creuser un peu le PIVOT pour voir si je peux arrive a faire quelque chose !

    Merci pour votre temps et vos propositions.

    Bonne journée.

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/06/2014, 17h43
  2. utilisation d'une variable comme nom de colonne
    Par argonath dans le forum Développement
    Réponses: 11
    Dernier message: 13/08/2010, 14h43
  3. Utiliser les noms de colonne pour une boucle for
    Par RémiCA33 dans le forum R
    Réponses: 2
    Dernier message: 01/07/2010, 09h52
  4. Réponses: 7
    Dernier message: 08/04/2010, 10h54
  5. Réponses: 4
    Dernier message: 23/10/2009, 00h18

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