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 :

[SQLite] Comment obtenir une colonne calculée depuis une autre requête ?


Sujet :

Langage SQL

  1. #1
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 478
    Points : 10 179
    Points
    10 179
    Par défaut [SQLite] Comment obtenir une colonne calculée depuis une autre requête ?
    Bonjour,

    Bon, le titre est pas terrible, mais je n'arrivais pas à formuler ma demande.

    Je vous explique ce que j'aimerais faire. Tout d'abord voilà les tables en jeu.
    1) Une table de données T_SOM ayant entre autre les champs som_ident (identifiant : INTEGER Primary KEY Autoincrement), et som_nom (Nom : VARCHAR(35))
    2) Une autre table de donnees T_ECM ayant, là aussi deux champs principaux : ecm_ident : INTEGER Primary KEY Autoincrment) et ecm_nom (Nom : VARCHAR(15))
    3) Une table de lien. Chaque T_SOM pouvant avoir 1 à n T_ECM liés. La table de lien TL_LSE contient 2 champs (som_ident et ecm_ident).

    J'aimerais obtenir la liste des T_SOM avec un champ qui serait la concaténation des ecm_nom qui lui sont liés.

    Mettons que j'ai la table T_SOM suivante :
    som_ident som_nom
    1 som 1
    2 som 2
    3 som_3
    4 som_4
    5 som_5

    Et la table T_ECM suivante
    ecm_ident ecm_nom
    1 ecm 1
    2 ecm 2
    3 ecm_3
    4 ecm_4
    5 ecm_5

    Et la table de liens suivante
    som_ident ecm_ident
    1 2
    1 5
    2 3
    3 2
    3 4
    4 1
    4 3
    4 5
    5 3
    5 5

    J'aimerais obtenir une liste du genre

    som_1, (ecm_2, ecm_5)
    som_2, (ecm_3)
    som_3, (ecm_2, ecm_4)
    som_4, (ecm_1, ecm_3, ecm_5)
    som_5, (ecm_3, ecm_5)

    c'est bien évidement la colonne 2 qui me pose problème.

    Est-ce que c'est possible et si oui, comment ?

    Merci d'avance

    JS

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 219
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 219
    Points : 8 450
    Points
    8 450
    Billets dans le blog
    17
    Par défaut
    Il me semble que SQLite supporte GROUP_CONCAT(), alors :

    SELECT ALL
        CONCAT('som_', som_ident) AS som_list,
        CONCAT('(', GROUP_CONCAT(CONCAT('ecm_', ecm_ident), ', '), ')') AS ecm_list
    FROM TL_LSE
    GROUP BY som_ident;

  3. #3
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 478
    Points : 10 179
    Points
    10 179
    Par défaut
    Merci Seb de ta réponse, mais ce n'est pas ce que j'attendais.
    Les valeurs que j'ai données sont à titre d'exemple pas les vrais valeurs. Les Noms de la table T_SOM représentent des personnes et ceux de la table T_ECM représentent des Matières de cours.

    Donc, ce n'est pas seulement un concat de chaine qu'il me faut.

    Je pourrais avoir, par exemple

    Thierry MACHIN, (Espagnol, Maths, ESPS)
    Corinne TRUC (Français, Anglais, Comptabilité)

    etc...

    JS

  4. #4
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 432
    Points : 1 128
    Points
    1 128
    Par défaut
    Bonjour,

    Pourtant la réponse de base est là (GROUP_CONCAT)

    Selon ta demande et en supposant (eh oui) que la table de lien s’appelle T_SOM_ECM voici la requête qui semble fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select som_nom, group_concat(ecm_nom) from
       t_som_ecm a
       join t_som b on a.som_ident = b.som_ident
       join t_ecm c on a.ecm_ident = c.ecm_ident
    group by som_nom
    Avec les données que tu as fournies, tu obtiens :
    som 1 ecm 2,ecm_5
    som 2 ecm_3
    som_3 ecm 2,ecm_4
    som_4 ecm 1,ecm_3,ecm_5
    som_5 ecm_3,ecm_5
    NB. L'ajout des parenthèses et autres ornements est trivial

    Cordialement

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 219
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 219
    Points : 8 450
    Points
    8 450
    Billets dans le blog
    17
    Par défaut
    Donc, ce n'est pas seulement un concat de chaine qu'il me faut.
    Je donne la requête au plus simple qui répond précisément au use-case illustrant
    Si tu as besoin des libellés il suffit d'ajouter des jointures, comme l'a fait acaumes, mais on s'éloigne du problème initial.

  6. #6
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 478
    Points : 10 179
    Points
    10 179
    Par défaut
    Merci beaucoup à vous deux, c'est parfait, ça marche nickel.

    JS

  7. #7
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 478
    Points : 10 179
    Points
    10 179
    Par défaut
    Juste pour info.

    Dans SQLite, la fonction GROUP_CONCAT existe, mais pas la fonction CONCAT. Pour concaténer des chaines, il faut utiliser l'opérateur ||

    Je donne cette info à toute fin utile.

    JS

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 219
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 219
    Points : 8 450
    Points
    8 450
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Jon Shannow Voir le message
    Dans SQLite, la fonction GROUP_CONCAT existe, mais pas la fonction CONCAT. Pour concaténer des chaines, il faut utiliser l'opérateur ||

    Je donne cette info à toute fin utile.
    C'est bon à savoir.

    Avec MySQL CONCAT() existe

    et pour concaténer avec || il faut activer le mode PIPES_AS_CONCAT ou ANSI, sinon c'est un OR.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/04/2018, 05h05
  2. Réponses: 0
    Dernier message: 11/12/2008, 10h49
  3. Comment obtenir une colonne de largeur fixe ?
    Par spip68 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 21/09/2006, 18h12
  4. Réponses: 17
    Dernier message: 04/04/2005, 17h50

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